var name = "Global";
function funcA() {
var name = "FunA";
return function() {
console.log(this.name);
}
}
funcA()();
我使用节点在终端上运行上面的代码并返回undefined
但在Chrome控制台中,它将返回Global
。
为什么会这样?
答案 0 :(得分:2)
1。在浏览器环境中运行此脚本会强制该顶级var成为全局window
对象的属性。然后按MDN:
由于以下代码未处于严格模式,并且由于调用未设置此值,因此默认为全局对象,即浏览器中的窗口。
因此,在该函数内调用console.log(this.name);
意味着this
将成为全局window
对象的链接,该对象具有name
属性。 window.name
的值是“全局”。
2。 NodeJS没有window
个对象,但它有global
个对象。在NodeJS环境中运行脚本会在两种情况下中断:
(a)作为模块运行(例如,通过node test.js
),(b)作为模块运行(例如直接在节点控制台中运行)。
第二种情况(b)与浏览器的工作方式相同:global
将获得name
属性,this
将是global
的链接,
所以this.name
的值等于global.name
并且将是“全局”。
但第一个案例(a)与NodeJS doc不同:
Object全局命名空间对象。
在浏览器中,顶级范围是全局范围。这意味着在浏览器中var将定义一个新的全局变量。 在Node.js中,这是不同的。顶级范围不是全球范围; Node.js模块中的var内容将是该模块的本地内容。
因此,顶级var只是Node环境中的局部变量,并且由于global
没有name
属性,
致电console.log(this.name)
会显示undefined
。
答案 1 :(得分:0)
var
定义Global object
中的变量。
this
在浏览器或交互式节点会话时指向Global object
,但在脚本作为节点模块运行时指向exports-object
。
直到严格模式......