1

我在网上阅读了几篇this用 Javascript 进行解释的文章。虽然这些文章有很大帮助,但我仍然不清楚下面显示的行为。

这里说:

在全局执行上下文中(在 any 之外function), this 指的是全局对象,无论是否处于严格模式。

如果是这样,当以下代码与 node.

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?

谢谢你的帮助。

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

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

4

1 回答 1

2

在任何情况下,第一次和第三次显示this应该是相同的:在第一种情况下,您只输出 的当前this,而在第三种情况下,您再次传递into的当前值(作为上下文参数)。thissomefunc

但在第二种情况下,情况有所不同:您调用此函数时没有为其分配任何特定上下文,因此this它内部指向一个全局对象。

为什么你会得到一个空对象?一种解释是您的代码实际上被包装在一些通用闭包中,如下所示

var sandbox = {};
(function() {
  console.log(this);      // 1
  var somefunc = function(name) {
     console.log(this);
  }
  somefunc();             // 2
  somefunc.call(this);    // 3
}).call(sandbox);

由于此函数是在sandbox上下文中调用的,因此1和都3指向sandbox- 那是一个空对象。2不同的是:您不为此函数调用提供任何上下文,这就是为什么函数内部(当它以这种方式调用时)this指向global.

这正是当您尝试this在 Node 模块的全局上下文中访问时发生的情况。我将从这个讨论中引用一个解释:

Node 的模块被包装在一个闭包中,该闭包在对象的 this-context 中进行评估exports。因此,如果您这样做var a = 3,则不会将其添加到thisglobalexports。但是,如果你这样做,this.a = 3那么它将被添加到thisand exports

见:https ://gist.github.com/788414

请注意,它与在浏览器中使用代码完全不同。它没有包含在任何闭包中,因此所有调用(1、2 和 3)都指向该global对象。如您所知,这就是window.

于 2013-06-09T18:55:37.160 回答