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

时间:2016-07-31 08:21:19

标签: javascript performance loops variables declaration

有这两个选项:

选项A:

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

选项B:

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

我不知道在选项B中变量index是否在每次循环时重新声明,或者只是一次。

2 个答案:

答案 0 :(得分:4)

这两段代码完全相同(在大多数语言中就是这种情况,例如C,C ++和C#等)。如果变量在每次迭代时重新声明,那么遵循您的逻辑,它也将被重新初始化,并且将不断循环遍历同一个对象。你的循环将是无限的。

在旁注中,在JavaScript中,所有变量声明都被推送到函数范围;这意味着您可以在函数内的任何位置声明变量,即使在嵌套循环中也是如此,并且它们只会被声明一次。

Link to the var documentation

Relevant SO question

Other relevant SO answer

编辑@torazaburo的礼貌:

如果要声明具有局部范围的变量(例如,仅在当前块中定义的变量,例如forwhileif,您可以使用let声明:

let var1 = 123;

它还允许您覆盖具有相同名称但在更高范围内声明的变量,例如在此示例中来自docs:

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

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

答案 1 :(得分:2)

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

for (let i = 0; i < max; i++) { }
     ^^^

这种方法和其他方法之间的性能差异可能很小,但在代码的健壮性和清晰度方面有很大的优势。

首先,对于letifor构造的本地,因此它不会泄漏&#34;或修改其他i {1}}在外部范围内。

其次,也许更重要的是,为循环的每次迭代创建了新版本的i。从技术角度来说,如果你让一个变量&#34;那么,每次迭代都会得到一个新的绑定。 (见this excellent article)。这解决了使用最终值i在for循环内创建的闭包的古老问题。我们现在可以写

for (let i = 0; i < 10; i++) {
  setTimeout(() => alert(i), i * 1000);
}

而不是做一些笨拙的解决方法,如

for (var i = 0; i < 10; i++) {
  (function(i) {
    setTimeout(() => alert(i), i * 1000);
  }(i));
}

这是SO上无数问题的主题,你们中的许多人浪费了太多的脑循环学习。