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(让…)
- "这对我来说似乎太疯狂了,因为它以一种非故意的方式污染了命名空间。"—好吧,无论如何,您不应该太多地使用全局命名空间:—)函数范围的变量是合理的,而且在某些情况下,您甚至需要循环后的计数器变量—但是,是的,如果您自己非故意地罚款它,没有什么能阻止您不再到处使用const和let。
这就是为什么像babeljs这样的项目是为向后兼容创建的。
在这种情况下,w"标准"是尝试使用let,如果您希望向后兼容,则需要使用babel或其他一些编译器,使您的代码达到ES5标准。