我今天(通过艰难的方式)发现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 ++)。它们引用相同的变量,因此外部循环只运行一次!
为什么会这样?这种行为在任何情况下都有用吗?
答案 0 :(得分:0)
如您所见,第一个值出现两次,而最大数量的所有其他值只出现一次。
因此使用这种模式毫无意义。
重新声明将移至顶部,仅对同一变量使用一次。
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;
答案 1 :(得分:0)
我找不到任何用途。在没有任何警告或错误的情况下进行两次var i;
的能力似乎是语言的不完美。
正如this comment所指出的,使用let
代替var
解决了这个问题。虽然var
被提升到功能正文的开头,但let
只会被提升到最接近的{
。但是,let
尚未被广泛支持,因此如果您需要保持与旧浏览器的兼容性,则不应该使用它。
JSHint等代码检查工具可以帮助检测此类重复声明问题。