0

我今天(通过艰难的方式)发现 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++)。它们引用同一个变量,所以外循环只会运行一次!

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

4

2 回答 2

0

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

因此,使用这种模式完全没有意义。

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

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; }

于 2016-10-16T09:24:43.150 回答
0

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

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

像JSHint这样的代码检查工具可以帮助检测这种重复声明问题。

于 2016-10-17T07:44:49.253 回答