'this' 在节点环境中的行为不同于浏览器

'this' behaves differently in node environment than browser

我正在关注有关 thisexecution context 的教程。我观察到此代码在 Chrome 控制台中正确执行:


var globalThis = this

function myFunc () {  
  console.log('globalThis: ', globalThis)
  console.log('this inside: ', this)
  console.log(globalThis === this)
}

myFunc()

// globalThis: Window {...}
// this inside: Window {...}
// true

但是,当我尝试在节点环境中执行相同的代码时,我收到以下响应:

globalThis:  {}

this inside:  { console: [Getter],
  global: [Circular],
  process: 
   process {
     title: 'node',
     version: 'v8.16.2',
     ...

false

我理解全局节点this的值应该和浏览器的javascriptthis的值不一样,但是问题是,为什么myFunc's this的值不相等全局值?

这是因为节点模块的全局作用域是同一个模块,所以如果你在你的函数之外执行 console.log(this) 你引用的是一个空模块的全局作用域,它是一个空对象 {},但是当你在函数中执行相同的 console.log(this) 时,this 将指向全局节点范围(包含你所看到的:控制台、全局、进程和许多其他内容) ,现在如果你在严格模式下,你的函数内部的范围应该是 undefined 因为它没有定义默认的本地范围。

在全局范围是 Window 对象的浏览器上要简单得多。