Javascript 关闭没有按预期工作

Posted

技术标签:

【中文标题】Javascript 关闭没有按预期工作【英文标题】:Javascript closure not working as expected 【发布时间】:2016-06-19 04:15:34 【问题描述】:

我在 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】:

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

this.name = "Globals";

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

现在,当你写作时

p.namePrinter()();

同理:

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

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

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

【讨论】:

setTimeout 是如何得到答案的?我已经修好了,但我很好奇。这真的是骗子吗?

以上是关于Javascript 关闭没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 javascript 代码没有按预期工作

我的 django 模板布尔变量在 javascript 中没有按预期工作

javascript typeof null 没有按预期工作

Vue计算属性未按预期工作[关闭]

Javascript:Jquery 发布请求未按预期工作

Java:Foreach 循环在 int 数组上没有按预期工作? [复制]