gpt4 book ai didi

javascript - 为什么JavaScript声明的变量在初始化之前在全局对象中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:26:02 24 4
gpt4 key购买 nike

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

根据 JS docs on var keyword :

The scope of a variable declared with var is the enclosing function or, for variables declared outside a function, the global scope (which is bound to the global object).

众所周知,全局变量成为全局对象的属性 - 在浏览器环境中为“window”,在 node.js 中为“global”这意味着如果在函数内使用“var”关键字声明变量,它将成为局部变量,不会进入全局对象。

这个例子证明了这一点:

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

jsfiddle link

到目前为止一切顺利。然而,如果变量没有被初始化,它确实会成为窗口对象的一个​​属性,尽管它在函数范围内。

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

jsfiddle link

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

提前致谢。

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

'1' in window

这是错误的

在示例二中是

'undefined' in window

这是真的。

最佳答案

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

将测试更改为

console.log("t" in window, t);

关于javascript - 为什么JavaScript声明的变量在初始化之前在全局对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com