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