Javascript关闭不按预期工作

Fai*_*lde 3 javascript closures scope node.js

我在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
Run Code Online (Sandbox Code Playgroud)

geo*_*org 5

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

this.name = "Globals";
Run Code Online (Sandbox Code Playgroud)

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

现在,当你写作

p.namePrinter()();
Run Code Online (Sandbox Code Playgroud)

它是一样的:

func = p.namePrinter();
func();
Run Code Online (Sandbox Code Playgroud)

该函数是未绑定的(= object.之前没有),因此this它将是global对象.但那里没有name......

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