Javascript关闭不按预期工作

时间:2016-03-05 10:12:38

标签: javascript node.js scope closures

我在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 个答案:

答案 0 :(得分:5)

您的示例在浏览器中按预期工作,但在顶层的node.js thisglobal不同,它是您的模块.exports。所以当你这样做时

this.name = "Globals";

它将name: Globals分配给module.exports,而不是global对象。

现在,当你写

p.namePrinter()();

它与:

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

该功能未绑定(=之前没有object.),因此其this将是global对象。但那里没有name ......

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