关于javascript:我们应该总是使用’let’来进行循环吗?

Should we always use `let` in for loops?

本问题已经有最佳答案,请猛点这里访问。

众所周知,javascript不会为for循环中的每个循环创建新的作用域。例如,这段代码:

1
2
3
4
for(var i=0;i<10;i++){
    //some code
}
console.log(i); //prints 10 instead of ReferenceError!

i实际上是作为变量创建的,其范围与for循环之外的所有内容相同。这对我来说似乎完全疯狂,因为它以一种非故意的方式污染了名称空间。

但是,最新的ECMA规范添加了一个let关键字,用于将变量范围限定到包含的块中:

1
2
3
4
for(let i=0;i<10;i++){
    //some code
}
console.log(i); //gives ReferenceError 'i' is not defined

假设兼容性不是一个问题(IE11、火狐、Chrome中支持let,至少在严格模式下支持),那么我们现在应该将let视为编写for循环的标准、正确的方法吗?还是有理由继续使用var

另外,什么是实现兼容性的最佳方法?在支持的浏览器上使用let,但在其他浏览器上有某种回退,还是在每个人升级浏览器之前,我们一直使用var

  • "对于受支持的浏览器,是否仍然可以使用let,但是对于其他浏览器,是否有某种回退"——babel(或类似的浏览器)很可能就是您要寻找的。
  • 不,没有退路。如果您在一个不知道新语法的旧浏览器上使用let运行代码,无论您如何处理它,都将是一个语法错误。
  • 我认为如果您不使用babel(或类似的),那么您可以继续使用var关键字,因为所有的低版本浏览器都不支持es6(让…)
  • "这对我来说似乎太疯狂了,因为它以一种非故意的方式污染了命名空间。"—好吧,无论如何,您不应该太多地使用全局命名空间:—)函数范围的变量是合理的,而且在某些情况下,您甚至需要循环后的计数器变量—但是,是的,如果您自己非故意地罚款它,没有什么能阻止您不再到处使用constlet


这就是为什么像babeljs这样的项目是为向后兼容创建的。

在这种情况下,w"标准"是尝试使用let,如果您希望向后兼容,则需要使用babel或其他一些编译器,使您的代码达到ES5标准。