因为根据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
};
答案 0 :(得分:8)
let
在Ecma Script 6中引入 - 新的javascript版本 - 在撰写本文时仍处于开发阶段。因此,使用var
可以暂时让您浏览更多浏览器。
另一方面,我建议人们从现在开始使用let
代替var
。我会继续列出原因,但你已经在帖子中有一个链接,其中有一个很好的解释。简而言之,let
可以帮助您避免javascript中的变量提升并保留变量&#39;范围就在它需要的地方。
在我最近获得一个upvote之前,我已经忘记了这篇文章。我想更新此声明。我个人现在尽可能多地使用const
。如果您开始使用我强烈推荐的代码,并使用类似airbnb lint规则的东西,它也会告诉您使用const。它会使您的变量保持不变,因此一旦设置了它们就不能改变它们,因此它并不适用于所有情况。 const
和let
在var
范围内也具有优势,值得一读。我的使用等级是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
。