我偶然发现了一个我无法解释的 JavaScript 变量行为。
用 var 声明的变量的范围是封闭函数,或者对于在函数外部声明的变量,全局范围(绑定到全局对象)。
众所周知,全局变量成为全局对象的属性 - 浏览器环境中的“窗口”和 node.js 中的“全局”这意味着如果一个变量在函数内使用“var”关键字声明,它就会变成本地的并且不会不进入全局对象。
这个例子证明了这一点:
(function(){
var t = 1;
console.log(t in window, t); // outputs: false 1
}());
到目前为止,一切都很好。但是,如果变量没有被初始化,它会成为窗口对象的一个属性,尽管它在函数范围内。
(function(){
var t;
console.log(t in window, t); // outputs: true undefined
}());
为什么会这样?我在哪里可以了解此行为的详细信息?常规教程似乎没有涵盖这一点。
提前致谢。
[编辑]:多亏了 Pointy,现在很明显范围可以按预期工作。我只是对“in”操作员的行为有错误的理解。根据“in”文档,它将左手操作数强制为数字或字符串,并在右手对象中查找此类索引或属性名称。所以在示例一中它等于
'1' in window
这是错误的
在示例二中是
'undefined' in window
这是真的。