此关键字在 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
( {}
)、globalThis
和 module
,但是模块变量没有分配给它们,而是在内存中分配。
在浏览器中,顶级作用域是全局作用域。这意味着当你用 var
定义某些东西时,它变成了全局对象的 属性,即 window
。
所以bike
和name
都是在全局范围内定义的,这意味着它们都是window
属性,所以this
指向window
并且它有一个 name
属性,值为 Ninja
.
在节点中,全局范围内的任何变量都在不同的本地模块中定义,因此 bike
的 this
与 name
变量无关
我正在尝试学习 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
( {}
)、globalThis
和 module
,但是模块变量没有分配给它们,而是在内存中分配。
在浏览器中,顶级作用域是全局作用域。这意味着当你用 var
定义某些东西时,它变成了全局对象的 属性,即 window
。
所以bike
和name
都是在全局范围内定义的,这意味着它们都是window
属性,所以this
指向window
并且它有一个 name
属性,值为 Ninja
.
在节点中,全局范围内的任何变量都在不同的本地模块中定义,因此 bike
的 this
与 name
变量无关