函数外的Javascript中`this`的值是多少?

时间:2013-06-09 18:51:50

标签: javascript node.js

我在网上阅读了几篇解释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?

感谢您的帮助。

编辑(根据主持人的要求) * 这个问题和所选答案与上面链接的答案有何不同 *

我认为这里的问题和答案肯定比被认为是重复的问题更清楚。这里的答案通过提供示例代码来阐明节点正在做什么,这更有帮助。

1 个答案:

答案 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上下文中调用此函数时,3sandbox都指向2 - 这是一个空对象。 this是不同的:你没有为这个函数调用提供任何上下文,这就是里面函数的原因(当它被调用时){{1} }指向global

当您尝试在Node模块的全局上下文中访问this时,会发生这种情况。我将引用this discussion的解释:

  

节点的模块包装在一个闭包中,在闭包中进行评估   exports对象的此上下文。那么,如果你做var a = 3,那么   它不会添加到thisglobalexports。但是,如果您执行this.a = 3,则会将其添加到thisexports

     

请参阅:https://gist.github.com/788414

请注意,它与使用代码完全不同,因为它在浏览器中。它没有包含在任何闭包中,因此所有调用-1,2和3都指的是global对象。如你所知,那就是window