在 Javascript 中重新声明变量

Re-declaring variables in Javascript

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

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

我不小心为两个循环使用了相同的标识符 i

Java脚本compiler/interpreter不会产生错误(像Java),它也不会创建一个不同的变量来隐藏外循环的变量(像C++ ).它们引用同一个变量,所以外层循环只会运行一次!

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

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

所以使用这种模式完全没有意义。

重新声明被移到顶部并且只对同一个变量使用一次。

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

我找不到这个有什么用。在没有任何警告或错误的情况下执行 var i; 两次的能力似乎是语言的缺陷。

正如 中所指出的,使用 let 而不是 var 可以解决这个问题。 var 提升到函数体的开头,而 let 仅提升到最近的 {。但是,let 尚未得到广泛支持,因此如果您需要保持与旧版浏览器的兼容性,则不应立即使用它。

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