【问题标题】:'let' vs 'var' in javascript for loops, does it mean that all the for loops using the 'var i =0' should actually be 'let i =0' instead?'let' 与 'var' 在 javascript for 循环中,这是否意味着所有使用 'var i =0' 的 for 循环实际上应该是 'let i =0'?
【发布时间】:2015-11-25 15:33:29
【问题描述】:

根据What's the difference between using "let" and "var" to declare a variable?,当在 for 循环中使用时,let 关键字的作用域比 var 小。这是否意味着在所有 'for (var i=0...' ...' 希望 var i 在 for 循环之外仍然可见,这意味着所有 'for (var i=0...' 都是错误的,正确的方法是 'for (let i=0... '?只是一个是或否的问题。

function allyIlliterate() {
    //tuce is *not* visible out here

    for( let tuce = 0; tuce < 5; tuce++ ) {
        //tuce is only visible in here (and in the for() parentheses)
    };

    //tuce is *not* visible out here
};

function byE40() {
    //nish *is* visible out here

    for( var nish = 0; nish < 5; nish++ ) {
        //nish is visible to the whole function
    };

    //nish *is* visible out here
};

【问题讨论】:

  • 从答案的完全分裂来看,有充分的理由支持和反对,我认为这可能符合“主要基于意见”。
  • @ajm 我基本同意,尽管措辞清楚地询问“所有 for 循环”是否“错误”,我认为这不是意见问题。
  • 确实如此。看看答案是否保持相同的 50/50 分割会很有趣。 :-)

标签: javascript


【解决方案1】:

let 在 Ecma Script 6 中引入 - 新的 javascript 版本 - 在撰写本文时仍在开发中。因此,使用var 暂时可以让您使用更多浏览器。

另一方面,我敦促人们从现在开始使用let 而不是var。我会继续列出原因,但你的帖子中已经有一个链接,里面有很好的解释。长话短说,let 可以帮助您避免 javascript 中的变量提升,并将变量的范围保持在需要的位置。

更新

直到我最近获得了赞成票,我才忘记了这篇文章。我想更新这个声明。这些天我个人尽可能多地使用const。如果你开始 linting 你的代码,我强烈推荐,并使用类似 airbnb lint 规则的东西,它也会告诉你使用 const。它将使您的变量成为常量,因此一旦设置它们的值,您将无法对其进行变异,因此它不适用于所有情况。 constlet 在范围方面也比 var 更有优势,值得一读。我的使用层次结构是这样的const > let > var

【讨论】:

  • ES6 现在是 ES2015,一个最终的标准 :)
  • 对...Check it out
  • 您是否建议将 cont 用于 OPs for 循环? const 不应该保持不变吗?
【解决方案2】:

是的,您会想在那里使用let,因为它的作用域仅限于该块。

此外,如果您在循环中调用函数并将计数器作为参数传递,以这种方式使用 let 可以避免意外创建闭包。

编辑:也许这应该更好地表述为:问问自己是否需要在循环之外访问变量的值。如果这样做,请使用var;在所有其他情况下,请使用let

【讨论】:

    【解决方案3】:

    在我看来,答案是“不”:

    function doSomething( anArray ) {
      for (var i = 0; i < anArray.length; ++i) {
        if (someTest( anArray[i] ))
          break;
      }
      return i === anArray.length ? "test failed" : "test succeeded";
    }
    

    这不是世界上最漂亮的事情,但在循环之后检查迭代器变量至少有点惯用。一个for 循环中的var i 也有可能在以后的for 循环中利用相同的函数,该循环不会重复var

    现在,是否应该以恰好利用let 的方式改进这样的代码是另一个问题。然而,应该清楚的是,在现有代码库中盲目地将 var 的这种用法替换为 let 是非常不明智的。

    展望未来,尽可能限制变量范围当然是个好主意,但是像“在 for 循环中始终使用 let 而不是 var”这样的教条规则不可能考虑到所有您可能遇到的编程问题。 “最佳实践”是“最佳”,除非它不是。

    【讨论】:

    • 实际上,更改该函数非常容易,因此您可以使用let 而不是var,并通过在过程中删除? : 运算符来简化它。只需在进入循环之前设置一个默认返回值,并在break 语句之前更新它。
    • @Arjan 我明白;关键是,它并不是“错误”的。如果重新编写会更好吗?好吧,这是一段罕见的代码,不会:)
    • 其实在这种情况下你可以使用 let INSTEAD of var。只需将 i 的声明移出 for 循环(将这样的行放在 for 循环“let i;”的上方,并在 for 循环中使用声明的 i,如下所示:“for (i=0; i<... i>
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2011-05-21
    • 2012-09-19
    • 2015-07-05
    相关资源
    最近更新 更多