关于javascript:循环中声明的变量和重用变量会发生什么

What happens to variables declared in loops and the re-used

本问题已经有最佳答案,请猛点这里访问。

在javascript中,变量只有函数作用域。所以它要么是全局的,要么是整个函数中可访问的变量,而不管它在哪里声明(在函数中)。

我想最好的做法是在'use strict';之后声明顶层的所有变量。

如果我在5个循环中声明相同的ivar,会发生什么?

1
for (var i = 0; i < someValue; i+=1) { ... }

变量是简单地重置为0,还是循环将其初始值设置为什么,一切都将继续?这会导致并发症吗?


如您所见,ifor循环开始时设置为0i = 0var i部分被提升到功能顶部,每增加一个var i …部分重新声明ii = 0部分重新定义。重新声明是不必要的,并且使代码不那么干净(JShint警告您这一点)。

如果以后在任何循环之外使用i,则该i将设置为for循环对其所做的任何操作。

1
2
3
4
5
6
7
8
for(var i = 0; i < 4; i++){
  /*
  As the last few steps i is incremented (i == 4),
  then it is checked with (i < 4), which is false; the loop is done.
  */

  //…
}
i; // 4

因为您通常会重新定义循环头中的每个迭代变量,所以这不会导致任何其他问题。

但是,对于更干净的代码,最好每个循环使用一个变量,或者使let变量而不是var变量,因为let变量仅限于for循环块:

1
2
3
4
5
6
7
for(let i = 0; i < 20; i++){
  // …
}

for(let i = 0; i < 10; i++){ // This is fine.
  // …
}

let变量仅在符合ecmascript-6的浏览器中可用,在firefox中需要版本选择。