【发布时间】:2016-10-16 09:21:18
【问题描述】:
我今天(通过艰难的方式)发现 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++)。它们引用同一个变量,所以外层循环只会运行一次!
为什么会这样?这种行为在任何情况下都有用吗?
【问题讨论】:
-
Is this behaviour useful in any circumstance at all- 可能是 - 我想不出每一种情况都可以明确地说出来:p -
不,它根本没有用。这是语言的主要问题之一。但是对于 es6,您可以使用块范围的变量
let和const -
@synthet1c 感谢您关注
let和const。我不知道 JavaScript 会将变量提升到函数声明的顶部。呸。而且我认为只有 VBA 才能做到这一点。 -
@Bernard 另请注意,在内部
for循环中放置break语句会导致其他问题。 -
@Bernard 迭代将返回外循环,然后返回内循环,其中任何一个都没有完成,最终永远不会停止重复该过程。也就是说,直到无限递归停止
Task manager
标签: javascript scope variable-declaration redeclaration