我已经有一段时间没有进行过认真的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){
...
});