
(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是怎么得出的?
1 Chingim 2017 年 5 月 30 日 模块里的 this 并不等于 global |
2 Chingim 2017 年 5 月 30 日 而是等于 module.exports, 本来是空对象, 但是通过 this.foo = foo 添加了属性, 所以结果也就是{ foo: [Function: cls] } |
4 dangyuluo 2017 年 5 月 30 日 用 global 来命名有点容易引起歧义 |
5 O3YwA1ENkb7i35XJ 2017 年 5 月 31 日 ``` var cls = function() { console.log(this === global, this); } ``` 自己运行看结果, 看输出是 true, 还是 false? |
6 O3YwA1ENkb7i35XJ 2017 年 5 月 31 日 ``` (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 自己看. |
7 joesonw 2017 年 5 月 31 日 函数里面的 this 是往上找的, 最后 foo 是挂在 global 下面的(对象的方法), 所以给出的是 global 的值. 你不用 this, 参数传一个 object 进去也是可以的. |
8 skyfore 2017 年 7 月 7 日 为什么我在浏览器中运行你的代码打印出来是 Window 然后在 node 中打印出来是 global 呢。。。 |