为什么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?

下一篇: JavaScript split and add a string