';让';vs';var';在javascript for循环中,是否意味着所有for循环都使用';变量i=0';实际上应该是';设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

因为根据,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

    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
in
for
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