【问题标题】:Declaring variables inside or outside in a for-in loop在 for-in 循环内部或外部声明变量
【发布时间】:2016-12-05 13:04:57
【问题描述】:

有这两个选项:

选项 A:

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

选项 B:

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

我不知道选项 B 中的变量 index 是不是每次循环都被重新声明还是只重新声明一次。

【问题讨论】:

    标签: javascript performance loops variables declaration


    【解决方案1】:

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

    附带说明,在 JavaScript 中,所有变量声明都被推送到函数范围;这意味着您可以在函数中的任何位置声明变量,甚至在嵌套循环中,并且它们只会被声明一次。

    Link to the var documentation

    Relevant SO question

    Other relevant SO answer

    编辑礼貌@torazaburo:

    如果你想声明一个具有局部作用域的变量(例如,一个只会在当前块中定义的变量,例如forwhileif,你可以使用@987654328 @声明:

    let var1 = 123;
    

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

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

    查看完整文档(和示例)here

    【讨论】:

    • 在这个答案中包含let在这种情况下的工作方式似乎非常有用。
    【解决方案2】:

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

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

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

    首先,对于letifor 构造的本地对象,因此它不能“泄露”或修改外部范围内的其他i

    其次,也许更重要的是,为循环的每次迭代创建一个新版本的i。用技术术语来说,“如果你让声明一个变量,你每次迭代都会得到一个新的绑定”(参见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 的无数问题的主题,你们中的许多人已经浪费了太多的大脑周期来学习。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2014-02-16
      • 2010-12-25
      • 2010-09-27
      • 2014-03-24
      相关资源
      最近更新 更多