JavaScript闭包无法按预期工作

3

我在nodejs上运行这段代码。我想知道为什么执行闭包时不会打印字符串“Globals”?难道闭包中的this指向全局作用域吗?

// Running on NodeJS, not in a browser!
this.name = "Globals";

function Person(name) {
  this.name = name;
  this.namePrinter = function() {
    return function() {
      console.log(this.name);
    }
  }
}

var p = new Person("Faiz");
p.namePrinter()(); // prints undefined. Shouldn't it print Globals?
console.log(this.name); // prints Globals
1个回答

5

您的示例在浏览器中按预期工作,但在node.js中,顶层的thisglobal不同,它是您的模块.exports。因此,当您执行以下操作时:

this.name = "Globals";

它将name:Globals分配给module.exports,而不是全局对象global。现在,当您编写以下内容时:
p.namePrinter()();

这与以下内容相同:

func = p.namePrinter();
func();

该函数未绑定(即在其前面没有“object.”),因此其“this”将是全局对象。但在那里没有“name”...
在浏览器中,您的顶级代码在全局对象的上下文中执行(即“window”),而未绑定函数使用的正是该对象。这就是为什么您的片段有效的原因。

setTimeout 是如何被引入答案的?我已经修复了,但是我很好奇。这实际上是一个重复的问题吗? - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接