& # 39;还是# 39;vs & # 39; var # 39;在javascript for循环中,是否意味着所有

'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?

本文关键字:是否 意味着 javascript vs 还是 var for 循环      更新时间:2023-09-26

因为根据What'和";var"声明一个变量?在for循环中使用let关键字时,其作用域比var小。这是否意味着在所有'for (var i=0…真正正确的方法应该是用let?我无法想象一个开发人员使用"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
};

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

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

更新

我已经忘记了这篇文章,直到最近我得到了一个赞。我想更新一下这份声明。这些天我个人尽可能多地使用const。如果你开始检查你的代码,这是我强烈推荐的,并且使用像airbnb lint rules这样的东西,它也会告诉你使用const。它将使你的变量成为一个常量,这样你就不能在设置它们的值后改变它们,因此它并不适用于所有情况。constlet在作用域方面也比var有优势,值得一读。我的使用层次是这样的const> let> var

是的,您将希望在那里使用let,因为它将仅作用于该块。

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

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

在我看来,答案是"不":

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在同一个函数中被另一个不重复varfor循环所利用。

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

展望未来,保持变量作用域尽可能受限当然是一个好主意,但是像"在for循环中始终使用let而不是var"这样的教条规则不可能考虑到您可能遇到的所有编程问题。"最佳实践"是"最佳",直到它不是"最佳"。