Javascript闭包未按预期工作

Javascript闭包未按预期工作,javascript,node.js,scope,closures,Javascript,Node.js,Scope,Closures,我正在nodejs上运行这段代码。我想知道为什么执行闭包时不打印字符串“Globals”?闭包中的这个不是指向全局范围吗 // Running on NodeJS, not in a browser! this.name = "Globals"; function Person(name) { this.name = name; this.namePrinter = function() { return function() { console.log(this.

我正在nodejs上运行这段代码。我想知道为什么执行闭包时不打印字符串“Globals”?闭包中的
这个
不是指向全局范围吗

// 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

您的示例在浏览器中可以正常工作,但在node.js
中,顶层的此
全局
不同,它是您的模块
。导出
。所以当你这么做的时候

this.name = "Globals";
它将
name:Globals
分配给
模块。导出
,而不是分配给
全局
对象

现在,当你写作的时候

p.namePrinter()();
这与:

func = p.namePrinter();
func();
函数未绑定(=前面没有
对象。
),因此它的
this
将是
全局
对象。但是那里没有名字


在浏览器中,顶级代码在全局对象(即
窗口
)的上下文中执行,这与未绑定函数使用的对象相同。这就是您的代码片段工作的原因。

如何回答
setTimeout
?我已经修好了,但我很好奇。这真的是个骗局吗?