请问这段代码的 this 是怎么得出的?

2017-05-30 21:50:28 +08:00
 searene
(function(global) {
    var foo = (function() {
        var cls = function() {
            console.log(this);
        }
        return cls;
    })();

    global.foo = foo;
})(this);

this.foo();

分析了一下这段代码,发现this.foo就是cls,所以调用this.foo()就等于调用cls(),而cls()就一个作用,输出当前的this值。

我记得this就是指当前函数的调用者,也就是foo的调用者,由this.foo()可以看出,foo的调用者就是全局对象global,那么这段程序就应该输出global才对,然而答案却不是global,答案是:{ foo: [Function: cls] }

请问这个this是怎么得出的?

3050 次点击
所在节点    Node.js
8 条回复
Chingim
2017-05-30 22:01:17 +08:00
模块里的 this 并不等于 global
Chingim
2017-05-30 22:04:08 +08:00
而是等于 module.exports, 本来是空对象, 但是通过 this.foo = foo 添加了属性, 所以结果也就是{ foo: [Function: cls] }
searene
2017-05-30 22:18:45 +08:00
@Chingim 谢谢,试了试确实如此。
dangyuluo
2017-05-30 22:37:12 +08:00
用 global 来命名有点容易引起歧义
xqin
2017-05-31 00:10:09 +08:00
```
var cls = function() {
console.log(this === global, this);
}
```

自己运行看结果, 看输出是 true, 还是 false?
xqin
2017-05-31 00:11:51 +08:00
```
(function(global) {
var foo = (function() {
var cls = function() {
console.log(this === global, this, global);
}
return cls;
})();

global.foo = foo;
})(this);

this.foo();

console.log(this)
```
再加个 log 自己看.
joesonw
2017-05-31 14:52:47 +08:00
函数里面的 this 是往上找的, 最后 foo 是挂在 global 下面的(对象的方法), 所以给出的是 global 的值. 你不用 this, 参数传一个 object 进去也是可以的.
skyfore
2017-07-07 16:12:14 +08:00
为什么我在浏览器中运行你的代码打印出来是 Window 然后在 node 中打印出来是 global 呢。。。

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

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

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

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

© 2021 V2EX