为什么JavaScript声明变量在初始化之前在全局对象中?
我偶然发现了一个我无法解释的JavaScript变量行为。
根据关于var关键字的JS文档:
用var声明的变量的作用域是封闭函数,或者对于在函数外声明的变量,全局作用域(绑定到全局对象)。
此外,众所周知,全局变量成为全局对象的属性 - 浏览器环境中的'window'和node.js中的'global'。这意味着如果一个变量在函数内部用'var'关键字声明,它就变成了局部变量不进入全球对象。
这个例子证明了它:
(function(){
var t = 1;
console.log(t in window, t); // outputs: false 1
}());
jsfiddle链接
到现在为止还挺好。 但是,如果变量没有被初始化,它就会成为window对象的一个属性,尽管它在函数范围内。
(function(){
var t;
console.log(t in window, t); // outputs: true undefined
}());
jsfiddle链接
为什么会发生? 我在哪里可以了解这种行为的细节? 普通的教程似乎没有涵盖这一点。
提前致谢。
[编辑]:感谢Pointy现在很清楚范围是否按预期工作。 我只是对'in'操作符行为有一个错误的理解。 根据'in'文档,它将左手操作数强制转换为数字或字符串,并在右手对象中查找此类索引或属性名称。 所以在这个例子中,它等于
'1' in window
这是错误的
在例子2中就是这样
'undefined' in window
这是真的。
问题在于你的测试代码错误地使用了in
运算符。 它实际测试的是在window
是否定义名称“undefined”,而不是“t”。 为什么? 因为in
的左侧操作数被强制为一个字符串。 由于“t”是undefined
,它被强制为字符串“undefined”,并且该属性名称确实存在于全局上下文中。
将测试更改为
console.log("t" in window, t);
访问由。声明的变量
var t;
给你:
console.log(t);
undefined
console.log(undefined === t)
true
未定义是窗口的属性
console.log(undefined in window);
链接地址: http://www.djcxy.com/p/74989.html
上一篇: Why JavaScript declared variable is in the global object before initialization?