首页 > 解决方案 > 这个关键字在 NodeJS 和 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

有人可以解释一下吗?

标签: javascriptnode.jslexical-scope

解决方案


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

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

在node中,全局范围内的任何var都定义在不同的本地模块中,因此this与变量bike无关name


推荐阅读