此关键字在 NodeJS 和 Vanila 之间的行为不同 JavaScript

this keyword acts different between NodeJS and Vanila JavaScript

我正在尝试学习 JavaScript 词法范围和闭包。我 运行 这个例子使用 Node.js 然后在浏览器中得到 2 个不同的输出。

测试于 chrome Version 80.0.3987.149 (Official Build) (64-bit)
Node v12.16.1

var obj1 = {
        name: "Pulsar",
        bike: function() {
          console.log(this.name);
        }
      }
      var obj2 = { name: "Gixxer", bike: obj1.bike };
      var name = "Ninja";
      var bike = obj1.bike;
      
      bike();           // "Ninja"
      obj1.bike();      // "Pulsar"
      obj2.bike();      // "Gixxer"

此代码片段在 Vanilla JavaScript 中的行为不同。输出是:

Ninja 
Pulser
Gixxer

并且在 NodeJS 中输出是:

undefined
Pulsar
Gixxer

有人可以解释一下吗?

在浏览器中,window 对象是全局 this 对象,所有变量都被分配为它的 属性。在节点中,没有这样的对象。有 this ( {} )、globalThismodule,但是模块变量没有分配给它们,而是在内存中分配。

在浏览器中,顶级作用域是全局作用域。这意味着当你用 var 定义某些东西时,它变成了全局对象的 属性,即 window

所以bikename都是在全局范围内定义的,这意味着它们都是window属性,所以this指向window 并且它有一个 name 属性,值为 Ninja.

在节点中,全局范围内的任何变量都在不同的本地模块中定义,因此 bikethisname 变量无关