Javascript 在for-in循环中声明内部或外部变量

Javascript 在for-in循环中声明内部或外部变量,javascript,performance,loops,variables,declaration,Javascript,Performance,Loops,Variables,Declaration,有两种选择: 备选方案A: var index; for (index in myObject) { // Do something } 备选案文B: for (var index in myObject) { // Do something } 我不知道在选项B中变量代码> ,每次循环时都被重新声明,或者只是一次。 代码的两段代码完全相同(在大多数语言中,例如C、C++和C等)。如果变量在每次迭代时都被重新声明,那么按照您的逻辑,它也将被重新初始化,并将不断循环到同一个对象上。你的

有两种选择:

备选方案A:

var index;
for (index in myObject) {
  // Do something
}
备选案文B:

for (var index in myObject) {
  // Do something
}

我不知道在选项B中变量<>代码> <代码>,每次循环时都被重新声明,或者只是一次。

代码的两段代码完全相同(在大多数语言中,例如C、C++和C等)。如果变量在每次迭代时都被重新声明,那么按照您的逻辑,它也将被重新初始化,并将不断循环到同一个对象上。你的循环将是无限的

另一方面,在JavaScript中,所有变量声明都被推送到函数范围;这意味着您可以在函数中的任何位置声明变量,甚至在嵌套循环中也可以,并且只能声明一次

编辑由@torazaburo提供:

如果要声明具有局部作用域的变量(如中,仅在当前块中定义的变量,如
for
while
If
,可以使用
let
语句:

let var1 = 123;
它还允许您覆盖具有相同名称但在更高范围内声明的变量,例如本例中的文档:

function letTest() {
    let x = 1;
    if (true) {
        let x = 2;  // different variable
        console.log(x);  // 2
    }
    console.log(x);  // 1
}

请参阅完整文档(和示例)。

2016年的首选方法是使用
let
在循环头中声明变量:

for (let i = 0; i < max; i++) { }
     ^^^
而不是做一些笨拙的工作,比如

for (var i = 0; i < 10; i++) {
  (function(i) {
    setTimeout(() => alert(i), i * 1000);
  }(i));
}
for(变量i=0;i<10;i++){
(职能(一){
设置超时(()=>警报(i),i*1000);
}(i) );
}

这一直是这里无数问题的主题,你们中的许多人浪费了太多的大脑周期来学习。

在这个答案中包含
let
如何在这种情况下工作似乎非常有用。
for (var i = 0; i < 10; i++) {
  (function(i) {
    setTimeout(() => alert(i), i * 1000);
  }(i));
}