在javascript for循环中'let'vs'var',是否意味着使用'var i = 0'的所有for循环实际上应该是'let i = 0'而是?

时间:2015-08-31 14:44:30

标签: javascript

因为根据What's the difference between using "let" and "var" to declare a variable?,当在for循环中使用时,let关键字的范围小于var。这是否意味着'for(var i = 0 ...'的实际正确方法应该使用let的所有地方?我无法想象一个开发人员正在使用'for(var i = 0)的情况......'希望var i仍然可以在for循环之外看到,这意味着所有'for(var i = 0 ...'都是错的,正确的方法是'for(让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
};

3 个答案:

答案 0 :(得分:8)

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

另一方面,我建议人们从现在开始使用let代替var。我会继续列出原因,但你已经在帖子中有一个链接,其中有一个很好的解释。简而言之,let可以帮助您避免javascript中的变量提升并保留变量&#39;范围就在它需要的地方。

更新

在我最近获得一个upvote之前,我已经忘记了这篇文章。我想更新此声明。我个人现在尽可能多地使用const。如果您开始使用我强烈推荐的代码,并使用类似airbnb lint规则的东西,它也会告诉您使用const。它会使您的变量保持不变,因此一旦设置了它们就不能改变它们,因此它并不适用于所有情况。 constletvar范围内也具有优势,值得一读。我的使用等级是const&gt; let&gt; var

答案 1 :(得分:6)

在我看来,答案是&#34; no&#34;

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

这不是世界上最漂亮的东西,但是在循环之后检查迭代器变量至少有些惯用。同样的var i循环中的for也可能在稍后for循环中的同一函数中被利用,而var循环不会重复{{1} }}

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

展望未来,保持变量范围尽可能受到限制肯定是一个好主意,但像#34的教条规则总是在{{1}中使用let而不是var循环&#34;我们可能无法考虑您可能遇到的所有编程问题。 A&#34;最佳实践&#34;是最好的&#34;直到它不是。

答案 2 :(得分:6)

是的,您可能希望在那里使用let,因为它只限于该块。

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

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