';让';vs';var';在javascript for循环中,是否意味着所有for循环都使用';变量i=0';实际上应该是';设i=0';相反
因为根据,let关键字在for循环中使用时的作用域比var小。这是否意味着在所有“for(var i=0…”的地方,实际正确的方法应该是使用let?我无法想象一个使用“for(var i=0…”的开发人员希望在for循环之外仍然可以看到var i的情况,这意味着所有“for(var i=0…”都是错误的,正确的方法是“for”(设i=0…’?只是一个是或否的问题';让';vs';var';在javascript for循环中,是否意味着所有for循环都使用';变量i=0';实际上应该是';设i=0';相反,javascript,Javascript,因为根据,let关键字在for循环中使用时的作用域比var小。这是否意味着在所有“for(var i=0…”的地方,实际正确的方法应该是使用let?我无法想象一个使用“for(var i=0…”的开发人员希望在for循环之外仍然可以看到var i的情况,这意味着所有“for(var i=0…”都是错误的,正确的方法是“for”(设i=0…’?只是一个是或否的问题 function allyIlliterate() { //tuce is *not* visible out here
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
};
函数allyIlliterate(){
//tuce在这里不可见
for(设tuce=0;tuce<5;tuce++){
//tuce仅在此处(以及for()括号中)可见
};
//tuce在这里不可见
};
函数byE40(){
//在这里可以看到nish
对于(变量nish=0;nish<5;nish++){
//nish对整个函数可见
};
//在这里可以看到nish
};
在我看来,答案是“否”:
function doSomething( anArray ) {
for (var i = 0; i < anArray.length; ++i) {
if (someTest( anArray[i] ))
break;
}
return i === anArray.length ? "test failed" : "test succeeded";
}
函数doSomething(数组){
对于(变量i=0;i
这并不是世界上最漂亮的事情,但在循环后检查迭代器变量至少有点惯用。在一个for
循环中的var i
也有可能在以后的for
循环中的相同函数中被利用,而该循环不会重复var
现在,这样的代码是否应该以一种恰巧利用let
的方式加以改进是另一个问题。然而,应该清楚的是,在现有的代码库中盲目地用let
替换var
的这种用法是非常不明智的
展望未来,尽可能地限制变量范围当然是一个好主意,但是像“始终使用
let
而不是var
infor
for循环”这样的教条规则不可能考虑到您可能遇到的所有编程问题。“最佳实践”就是“最佳”直到它没有。让在Ecma脚本6中引入
,Ecma脚本6是一个新的javascript版本,在撰写本文时仍在开发中。因此,使用var
将使您暂时能够浏览更多的浏览器
另一方面,我敦促人们从现在开始使用let
而不是var
。我会继续列出原因,但你的帖子中已经有一个链接,其中有很好的解释。长话短说,let
可以帮助你避免javascript中的变量提升,并将变量的范围保持在适当的位置这是必须的
更新
我已经忘记了这篇文章,直到最近我得到了一个投票。我想更新这句话。我个人最近尽可能多地使用
const
。如果你开始使用我强烈推荐的lint代码,并使用airbnb lint规则,它也会告诉你使用const。它会使你的变量成为常量,所以一旦你设置了它们的值,你就无法对它们进行变异,因此它不适用于所有情况。const
和let
在范围上也比var
有优势,值得一读。我的用法层次是这样的const
let
var是的,你会想使用let
,因为其范围仅限于该块
此外,如果在循环中调用函数并将计数器作为参数传递,以这种方式使用let
,可以避免意外创建闭包
编辑:也许最好这样说:问问自己是否需要在循环之外访问变量的值。如果需要,请使用var
;在所有其他情况下,使用let
ES6现在是ES2015,一个最终标准:)是的……你是在建议在OPs for loop中使用cont吗?const不应该保持不变吗?从答案的完全分歧来看,有充分的理由支持和反对,我认为这可能符合“主要基于意见”。@ajm我基本上同意,尽管这个问题的措辞清楚地询问“所有for loop”是否“错误”,我不认为这是一个意见问题。这是真的。看看答案是否保持相同的50/50比例会很有趣。:-)实际上,更改该函数非常容易,因此您可以使用let
而不是var
,并通过删除过程中的?:
运算符来简化它。只需在进入循环之前设置一个默认返回值,并在break
语句之前更新它。@Arjan我理解;问题是,它不是事实上是“错的”。如果重新编写会更好吗?好吧,这是一段罕见的代码,不会:)实际上,在这种情况下,您可以使用let而不是var。只需将i的声明移出for循环(在for循环“let i”的上面放一行,并在for循环中使用声明的i,如下所示:“for(i=0;i