这个关键字在NodeJS和Vanila JavaScript之间的作用不同
我试图学习JavaScript词汇范围和闭包。我使用Node.js运行了这个示例,然后在浏览器中运行,得到了两个不同的输出 在chrome版本80.0.3987.149官方版本64位上测试 和节点v12.16.1 变量obj1={ 名称:脉冲星, 自行车:功能{ console.logthis.name; } } var obj2={name:Gixxer,bike:obj1.bike}; 变量名=忍者; var bike=obj1.bike; 自行车;//忍者 obj1.bike;//脉冲星这个关键字在NodeJS和Vanila JavaScript之间的作用不同,javascript,node.js,lexical-scope,Javascript,Node.js,Lexical Scope,我试图学习JavaScript词汇范围和闭包。我使用Node.js运行了这个示例,然后在浏览器中运行,得到了两个不同的输出 在chrome版本80.0.3987.149官方版本64位上测试 和节点v12.16.1 变量obj1={ 名称:脉冲星, 自行车:功能{ console.logthis.name; } } var obj2={name:Gixxer,bike:obj1.bike}; 变量名=忍者; var bike=obj1.bike; 自行车;//忍者 obj1.bike;//脉冲星
obj2.bike;//Gixxer在浏览器中,窗口对象是该对象的全局对象,所有变量都被指定为其属性。在节点中,没有这样的对象。有一个this{}、globalThis和module,但是模块变量没有分配给它们,而是在内存中分配。在浏览器中,窗口对象是this对象的全局对象,所有变量都被分配为其属性。在节点中,没有这样的对象。有一个this{}、globalThis和module,但是模块变量没有分配给它们,而是在内存中分配。在浏览器中,顶级作用域是全局作用域。这意味着,当您使用var定义某个对象时,它将成为全局对象(即窗口)的一个属性 所以bike和name都是在全局范围内定义的,这意味着它们都是窗口属性,所以这指向窗口,它有一个name属性,值为Ninja
在节点中,全局范围中的任何变量都在不同的本地模块中定义,因此自行车的this与名称变量无关。在浏览器中,顶级范围是全局范围。这意味着,当您使用var定义某个对象时,它将成为全局对象(即窗口)的一个属性 所以bike和name都是在全局范围内定义的,这意味着它们都是窗口属性,所以这指向窗口,它有一个name属性,值为Ninja
在节点中,全局范围内的任何变量都是在不同的本地模块中定义的,因此bike的this与名称变量无关要添加到该变量中,为了使OP的代码正常工作,bike变量需要使用bind到一个以名称变量为属性的对象,如:var bike=obj1.bike.bind{name};此外,为了使OP的代码正常工作,bike变量需要使用bind来绑定一个名为variable的对象作为属性,如下所示:var bike=obj1.bike.bind{name};这就是为什么它在两种环境中都不同这就是为什么它在两种环境中都不同