在循环中声明的变量和重新使用的变量会发生什么

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

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

我猜最好的做法是在 'use strict'; 之后立即在顶层声明所有变量?

如果我在 5 个循环中声明相同的 i 变量,会发生什么情况?

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

变量是否简单地重置为 0 或任何循环设置它的初始值并且一切都继续进行?这会引起并发症吗?

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

如果您稍后在任何循环之外使用 i,则 i 将设置为 for 循环对它所做的任何设置。

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 仅循环块:

for(let i = 0; i < 20; i++){
  // …
}

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

let 变量仅在兼容 ECMAScript-6 的浏览器中可用,在 Firefox 中需要选择加入版本。