在Javascript中重新声明变量

时间:2016-10-16 09:21:18

标签: javascript scope variable-declaration redeclaration

我今天(通过艰难的方式)发现JavaScript允许这样做,而不会产生任何错误:

for(var i = 0; i < 100; ++i){
    /* do some stuff */
    for(var i = 0; i < 200; ++i){
        /* do some more stuff */
    }
}

我偶然为两个循环使用了相同的标识符i

JavaScript编译器/解释器不会产生错误(如Java),也不会创建一个隐藏外部循环变量的不同变量(如C ++)。它们引用相同的变量,因此外部循环只运行一次!

为什么会这样?这种行为在任何情况下都有用吗?

2 个答案:

答案 0 :(得分:0)

如您所见,第一个值出现两次,而最大数量的所有其他值只出现一次。

因此使用这种模式毫无意义。

重新声明将移至顶部,仅对同一变量使用一次。

&#13;
&#13;
for (var i = 0; i < 10; ++i){
    console.log('outer', i);
    for (var i = 0; i < 20; ++i){
        console.log('inner', i);
    }
}
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我找不到任何用途。在没有任何警告或错误的情况下进行两次var i;的能力似乎是语言的不完美。

正如this comment所指出的,使用let代替var解决了这个问题。虽然var被提升到功能正文的开头,但let只会被提升到最接近的{。但是,let尚未被广泛支持,因此如果您需要保持与旧浏览器的兼容性,则不应该使用它。

JSHint等代码检查工具可以帮助检测此类重复声明问题。