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



我已经有一段时间没有进行过认真的JavaScript编程了,我正在为我的一些同事编写一份该语言的介绍指南。我想讨论循环最佳实践,但有一个小细节我一直记在脑后:

当在数组上循环时,我记得以下模式使用起来不安全,因为有一些主要的浏览器不支持它:

for (var i = 0; i < ls.length; i++) { ... }

相反,var关键字必须从数组中移出,例如:

var i;
for (i = 0; i < ls.length; i++) { ... }

这是正确的吗?我已经搜遍了网,无法证实这一点。有些旧浏览器不支持第一种方法吗?如果没有,哪些没有?

"这正确吗?"

除非我们谈论的是一些非常非常旧的浏览器,否则我不知道今天使用的浏览器有任何这样的问题。


人们对第一个例子可能遇到的唯一问题是,它可能会让人们误以为JavaScript有块作用域,而它没有自从ES6以来,情况发生了变化,它确实有块作用域。

在任何一个示例中,无论封闭环境是函数还是全局环境,i变量的作用域都将是封闭变量环境。

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

不一定。重点是,您不应该忘记i之前的var关键字,否则它将变成全局变量。所以如果你这样做也没关系:

for (var i = 0; i < ls.length; i++) { ... }

您可以通过创建一个保持数组/集合长度的变量来提高上述代码的性能,而不是在每次迭代中反复读取:

for (var i = 0, len = ls.length; i < len; i++) { ... }

顺便说一句,不用担心浏览器,这个循环应该在浏览器之间工作:)

假设您不支持任何早于IE6的浏览器,这应该不是问题。

JavaScript实际上声明的是函数级作用域,而不是块作用域。声明的变量被提升到其函数的顶部。我想说的是,你们的例子实际上是完全相同的。即使for语句中有var关键字,i变量也可以在循环之外访问。

唯一需要注意的是,如果省略var,变量将是全局的,而不是局限于函数。

今天遇到了这个

   for(var i=0; i < t; i++) {
//do whatever
}

我的jscript在一个从html文件调用的xsl文件中——在IE中运行良好,但在其他浏览器上运行不好——代码会崩溃,没有显示

幸运的是,我可以将其更改为,适用于所有经过测试的浏览器

for(var i=0; i != t; i++) {
do whatever}

还要注意https://support.microsoft.com/en-us/help/273793/how-to-include-client-side-script-functions-in-an-xsl-document

这不是你要求的,但你可以使用jQuery如下所示:

$.each(ls, function(i,value){
...
});

最新更新