node 中关于 this 全局对象和 var 的定义

2017-03-20 12:03:46 +08:00
 mihuoli
var  name = "this windos";
var object = {
    name   : "my object",
    getnamefunc : function () {
        return function () {
            return this.name;
        };

    }
};
var reslut  = object.getnamefunc();
console.log(object.getnamefunc()());
console.log(reslut);
console.log(reslut.toString());
console.log(reslut());
console.log(object.name);
console.log(name);```

在看高程3 关于 this 在闭包中介绍
如上代码

我在终端用 node 跑范例代码 结果 浏览器 和 node 给出了不同的答案 

在 node 7.7.2  结果

undefined
[Function]
function () {
            return this.name;
        }
undefined
my object
this windos

在 chrome   57.0.2987.98 (64-bit)

this windos
function () {
            return this.name;
        }
function () {
            return this.name;
        }
this windos
my object
this windos
2362 次点击
所在节点    Node.js
15 条回复
yangff
2017-03-20 12:11:22 +08:00
因为 window 刚好有 name 罢了…… 不信你换成 fuckedName 试试
yangff
2017-03-20 12:11:49 +08:00
哦看错了……
yangff
2017-03-20 12:12:55 +08:00
好像我在 node 上跑出来的结果和你不一样哇
morethansean
2017-03-20 12:15:26 +08:00
有什么问题吗?你想问啥?
morethansean
2017-03-20 12:21:22 +08:00
没注意你 node 的结果……你怎么跑出来的?
SuperMild
2017-03-20 12:24:43 +08:00
闭包和 this 不能混为一谈。闭包只涉及变量,而 this 不是变量。 this 有另一套规则,不适用于闭包的规则。
SuperMild
2017-03-20 12:30:29 +08:00
正因为有时候 this 比较不好确定,所以才有了利用闭包 that = this 这样的做法。
Niphor
2017-03-20 13:26:22 +08:00
因为 node 没全局 window ,他是 global
第一句 var name 并不会把 name 挂在 global 上...
Niphor
2017-03-20 13:29:30 +08:00
用 var 似乎会把 scope 指定在当前 module 中, node 运行 js 文件 每个文件都是一个闭包 好像
Cynic222
2017-03-20 13:39:06 +08:00
你肯定看错了 Node 的输出,console.log 的输出总是以 undefined 结束
mihuoli
2017-03-20 14:05:09 +08:00
@Niphor 我试了一下 的确  var name 不能 在 node 中不是定义全局变量
otakustay
2017-03-20 14:36:09 +08:00
你只要记住一点, node 里你写的 js 代码不是在全局跑,而是变成了一个函数的函数体,在这个函数里跑的就行,像__dirname 、 require 之类的都是这个函数的参数
otakustay
2017-03-20 14:37:21 +08:00
最简单的办法,写个 js :

console.log(arguments.callee.toString());

然后运行下看结果:

function (exports, require, module, __filename, __dirname) { console.log(arguments.callee.toString());

}
mihuoli
2017-03-20 15:44:30 +08:00
@otakustay 好的我试下
libook
2017-04-06 23:51:25 +08:00
node 里的全局对象是 global 吧,而且 node 里的作用域是按照 module 隔离的, var 声明的对象只存在于一个 module 内。。。
话说为了避免歧义和 BUG ,已经半年多不用 var 了,项目上已经用 ESLint 严格要求禁止出现 var 指令了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/348782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX