我在网上阅读了几篇解释Javascript中this
的文章。而文章
有很多帮助,下面显示的行为对我来说仍然不清楚。
Here它说:
在全局执行上下文中(在任何
function
之外),这个 是指全局对象,无论是否处于严格模式。
如果有,有人可以在下面的代码中解释行为(在评论中注明) 与节点一起运行。
console.log(this); // Returns an empty object: {}.
// Why does this line not return the global object.
var somefunc = function(name) {
console.log(this);
}
somefunc(); // Returns the the global object. I think I understand this. The function is
// invoked in a global context.
somefunc.call(this); // Again returns the empty object. Why?
感谢您的帮助。
编辑(根据主持人的要求) * 这个问题和所选答案与上面链接的答案有何不同 *
我认为这里的问题和答案肯定比被认为是重复的问题更清楚。这里的答案通过提供示例代码来阐明节点正在做什么,这更有帮助。
答案 0 :(得分:2)
this
的第一个和第三个显示在任何情况下都应该相同:在第一种情况下,您只输出{em>当前值this
,在第三种情况下再次将this
的当前值传递给somefunc
(作为上下文参数)。
但是在第二种情况下,情况有所不同:您调用此函数时不会将其分配给任何特定的上下文,因此this
内部的var sandbox = {};
(function() {
console.log(this); // 1
var somefunc = function(name) {
console.log(this);
}
somefunc(); // 2
somefunc.call(this); // 3
}).call(sandbox);
指向全局对象。
为什么你会得到一个空对象?一种解释是,您的代码实际上包含在一些通用的闭包中,如this:
sandbox
在1
上下文中调用此函数时,3
和sandbox
都指向2
- 这是一个空对象。 this
是不同的:你没有为这个函数调用提供任何上下文,这就是里面函数的原因(当它被调用时){{1} }指向global
。
当您尝试在Node模块的全局上下文中访问this
时,会发生这种情况。我将引用this discussion的解释:
节点的模块包装在一个闭包中,在闭包中进行评估
exports
对象的此上下文。那么,如果你做var a = 3
,那么 它不会添加到this
,global
或exports
。但是,如果您执行this.a = 3
,则会将其添加到this
和exports
。
请注意,它与使用代码完全不同,因为它在浏览器中。它没有包含在任何闭包中,因此所有调用-1,2和3都指的是global
对象。如你所知,那就是window
。