在for-in循环中,变量是在内部声明还是在外部声明?

4

Having this two options:

Option A:

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

选项B:
for (var index in myObject) {
  // Do something
}

我不确定在选项B中,变量index是否在每次循环中重新声明,还是仅仅声明一次。

2个回答

4
这两个代码片段执行的是完全相同的操作(在大多数编程语言中,如C、C++和C#等)。如果变量在每次迭代时被重新声明,那么按照你的逻辑,它也将被重新初始化,并且会不断循环同一个对象。你的循环将是无限的。
另外,在JavaScript中,所有变量声明都会被推送到函数作用域;这意味着你可以在函数内的任何位置声明变量,甚至在嵌套循环内部,它们只会被声明一次。 变量文档链接 相关SO问题链接 其他相关SO答案链接 编辑由@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
}

查看完整文档(和示例)在这里


在这个回答中,包含 let 在这个上下文中的工作原理似乎非常有用。 - user663031

2
在2016年的首选方法是在循环头中声明变量,使用let
for (let i = 0; i < max; i++) { }
     ^^^

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

首先,使用let关键字,i变量只在for循环内部有效,因此它不会“泄漏”或修改外部作用域中的其他i变量。

其次,更为重要的是,在每次循环迭代时都会创建一个新版本的i变量。从技术上讲,“如果您使用let声明一个变量,则每次迭代都会获取一个新的绑定”(请参见这篇优秀的文章)。这解决了在for循环内创建闭包时使用最终值i的古老问题。我们现在只需编写:

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上无数问题的话题,也让很多人浪费了太多的脑力去学习。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接