在 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 等代码检查工具可以帮助检测此类重复声明问题。
我今天发现(通过艰难的方式)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 等代码检查工具可以帮助检测此类重复声明问题。