我有一段时间没有做过严肃的JavaScript编程,我正在为一些同事编写一本介绍该语言的指南。我想讨论循环最佳实践,但我脑子里有一个小细节:
在循环数组时,我记得以下模式不安全使用,因为主流浏览器不支持它:
for (var i = 0; i < ls.length; i++) { ... }
相反,var关键字必须移出数组,如下所示:
var i;
for (i = 0; i < ls.length; i++) { ... }
这是对的吗?我在网上搜索过,无法证实这一点。有些旧浏览器不支持第一种方法吗?如果没有,哪些不是?
答案 0 :(得分:12)
“这是正确的吗?”
除非我们谈论一些非常真实的旧版浏览器,否则我今天使用的浏览器并没有发现任何此类问题。
人们可能在第一个例子中遇到的唯一问题是,可能会让某人误以为JavaScript已经阻止范围,但它没有这已经改变了自ES6以来确实存在阻止范围。
在任何一个示例中,i
变量将限定为封闭变量环境,无论封闭环境是函数还是全局环境。
答案 1 :(得分:7)
相反,var关键字必须移出数组
不一定。关键是您不应忘记var
之前的i
关键字,否则会转变为全局变量。如果你这样做就好了:
for (var i = 0; i < ls.length; i++) { ... }
您可以通过创建包含数组/集合长度的变量而不是每次迭代一次又一次地读取它来改进上述代码的性能:
for (var i = 0, len = ls.length; i < len; i++) { ... }
BTW不担心浏览器,该循环应该适用于浏览器:)
答案 2 :(得分:0)
假设您不支持任何早于IE6的浏览器,这应该不是问题。
答案 3 :(得分:0)
JavaScript实际上声明了功能级别范围而不是阻止范围。声明的变量被提升到其函数的顶部。我所说的是你的例子实际上是相同的。即使在var
语句中使用for
关键字,i
变量也可以在循环外访问。
唯一需要注意的是,如果省略var
变量将是全局变量而不是仅限于函数。
答案 4 :(得分:0)
今天碰到了这个
for(var i=0; i < t; i++) {
//do whatever
}
我的jscript是在一个从html文件调用的xsl文件中 - 在IE中工作得很好,但在其他浏览器上没有 - 代码会崩溃并且没有显示
幸运的是我可以将其更改为适用于所有经过测试的浏览器
for(var i=0; i != t; i++) {
do whatever}
答案 5 :(得分:-1)
并非您要求它,但您可以使用jQuery执行此操作,如下所示:
$.each(ls, function(i,value){
...
});