JavaScript"for(var i = 0; ...){...}"浏览器不兼容?

the*_*man 7 javascript for-loop cross-browser

我有一段时间没有做过严肃的JavaScript编程,我正在为一些同事编写一本介绍该语言的指南.我想讨论循环最佳实践,但有一个小细节我一直在脑后:

循环遍历数组时,我记得以下模式不安全使用,因为主流浏览器不支持它:

for (var i = 0; i < ls.length; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

相反,var关键字必须移出数组,如下所示:

var i;
for (i = 0; i < ls.length; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

它是否正确?我在网上搜索过,无法证实这一点.有些旧浏览器不支持第一种方法吗?如果没有,哪些不?

小智 12

"它是否正确?"

除非我们谈论一些真正的,非常古老的浏览器,否则我不知道今天使用的浏览器存在任何此类问题.


人们可能在第一个例子中遇到的唯一问题是,可能会让人误以为JavaScript具有块范围,而不是这样.自ES6以来,它确实具有块范围.

在任一示例中,i变量将作用于封闭变量环境,无论封闭环境是函数还是全局环境.


Sar*_*raz 7

相反,必须将var关键字移出数组

不必要.关键是你不应该忘记var关键字,i否则它将变成全局变量.所以如果你这样做会很好:

for (var i = 0; i < ls.length; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

您可以通过创建包含数组/集合长度的变量而不是每次迭代一次又一次地读取它来改进上述代码的性能:

for (var i = 0, len = ls.length; i < len; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

BTW不担心浏览器,该循环应该适用于浏览器:)

  • @thebossman:在JavaScript中,一切都是对象.在循环中,您使用的数组也是一个对象.在循环中,每次迭代都会一次又一次地读取它的值,例如JS在每次迭代时访问数组的属性,这比创建变量和为其分配长度需要更多的时间.当然,对于大多数用户或应用程序而言,这不是问题,但对于面向性能或大规模的应用程序而言,它变得至关重要. (2认同)