5

我偶然发现了一个我无法解释的 JavaScript 变量行为。

根据关于 var 关键字的 JS 文档

用 var 声明的变量的范围是封闭函数,或者对于在函数外部声明的变量,全局范围(绑定到全局对象)。

众所周知,全局变量成为全局对象的属性 - 浏览器环境中的“窗口”和 node.js 中的“全局”这意味着如果一个变量在函数内使用“var”关键字声明,它就会变成本地的并且不会不进入全局对象。

这个例子证明了这一点:

(function(){
    var t = 1;
    console.log(t in window, t); // outputs: false 1
}());

jsfiddle链接

到目前为止,一切都很好。但是,如果变量没有被初始化,它会成为窗口对象的一个​​属性,尽管它在函数范围内。

(function(){
    var t;
    console.log(t in window, t); // outputs: true undefined
}());

jsfiddle链接

为什么会这样?我在哪里可以了解此行为的详细信息?常规教程似乎没有涵盖这一点。

提前致谢。

[编辑]:多亏了 Pointy,现在很明显范围可以按预期工作。我只是对“in”操作员的行为有错误的理解。根据“in”文档,它将左手操作数强制为数字或字符串,并在右手对象中查找此类索引或属性名称。所以在示例一中它等于

'1' in window

这是错误的

在示例二中是

'undefined' in window

这是真的。

4

2 回答 2

4

问题是您的测试代码in错误地使用了运算符。它实际测试的是名称“undefined”是否定义在 中window,而不是“t”。为什么?因为左侧的操作数in被强制转换为字符串。因为 "t" is undefined,所以它被强制转换为字符串 "undefined",并且确实该属性名称存在于全局上下文中。

将测试更改为

console.log("t" in window, t);
于 2013-05-02T14:19:36.110 回答
2

访问由声明的变量

var t;

给你:

console.log(t);
undefined

console.log(undefined === t)
true

undefined 是窗口的属性

console.log(undefined in window);
于 2013-05-02T14:21:27.220 回答