【问题标题】:Changing the context of the function in Node JS [duplicate]在 Node JS 中更改函数的上下文 [重复]
【发布时间】:2019-05-03 08:26:04
【问题描述】:

我正在学习如何从 this slide 更改 Javascript 中函数的上下文。这里给出的例子是完全可以理解的:

var object = {}; 
function fn(){ 
  return this; 
} 
console.log( fn() == this) //true
console.log( fn.call(object) == object); //true

但是当我在 Node JS 中尝试这个时,结果有些不同。第一个语句导致false,第二个相等按预期工作。那么Node JS和浏览器的全局范围有什么区别吗?

我知道浏览器有名为window 的全局范围,但是Node JS 呢?导致上述不同行为的那些范围之间有什么区别?

【问题讨论】:

  • fn() == this 在 Node 8.9.3 中为我评估为 true(注意,最好选择严格相等而不是草率相等)
  • @CertainPerformance 请参阅:tpcg.io/EJZeya。这与我的本地 Node JS 给出了相同的结果。但是在浏览器中,这两个语句的计算结果都是true。我在 8.11.2 中的节点版本
  • 啊,我是直接输入 REPL,而不是运行 .js,这一定是造成差异的原因。
  • 您应该始终使用严格模式并期待fn() == undefined

标签: javascript node.js scope


【解决方案1】:

那么Node JS和浏览器的全局范围有什么区别吗?

不同之处在于脚本不在 Node 的全局范围内评估,而是在模块范围内评估,而 this 在直接评估时不是全局变量。

在浏览器中,它是this === window。在 Node.js 中,它是this === module.exports

如果fn 是一个箭头,那么在Node.js 中它就是this === module.exports。但由于它是常规函数,因此在像 fn() 这样调用时会在全局范围内进行评估。

【讨论】:

  • 那么从函数fn返回的this也应该是module.exports,所以第一个语句应该评估为true
  • 这就是直接评估所指的。由于fn 不是箭头,因此它不会从封闭上下文(模块范围)中获取this,而是在全局范围内进行评估。与eval('this')===module.exports(0, eval)('this')===global 相同。
  • 哦!当我把它改成箭头函数时,第一个返回true,第二个返回false!关于 JS 中的箭头与常规函数,我不知道的太多了。
  • 箭头函数总是得到词法this,它们忽略通过callapplybind 传递给它们的上下文。考虑检查stackoverflow.com/questions/34361379/…
  • 太棒了!我今天学到了很多东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 2019-05-23
  • 2018-05-15
  • 2018-03-23
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多