我正在尝试了解 JavaScript 词法范围和闭包。我使用 Node.js 运行了这个示例,然后在浏览器中得到了 2 个不同的输出。测试chrome Version 80.0.3987.149 (Official Build) (64-bit)和Node v12.16.1var 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 PulserGixxer在NodeJS输出中是:undefinedPulsarGixxer有人可以解释一下吗?
2 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
在浏览器中,顶级范围是全局范围。这意味着当你用它定义某些东西时,var
它就变成了全局对象的一个属性,即window
.
所以bike
andname
都定义在全局范围内,这意味着它们都是window
属性,所以this
指向window
并且它有一个name
属性,值为Ninja
。
在node中,全局范围内的任何var都定义在不同的本地模块中,因此this
与变量bike
无关name
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
在浏览器中,window
对象是全局this
对象,所有变量都被分配为其属性。在节点中,没有这样的对象。有一个this
( {}
)globalThis
和module
,但是模块变量没有被分配给它们,而是在内存中分配。
添加回答
举报
0/150
提交
取消