日期:2014-05-16  浏览次数:20323 次

"灵异"的JavaScript问题,没跑完的For循环。
昨天下午同事那边忽然说他出现了非常灵异的JS问题,大体是说,在一个FOR循环中,代码没有按设定好的条件去走.
for(i=0;i<array.length;i++){
    doSomething(array[i]);
}

上述的代码,无论在Firebug或者用alert都显示array.length是大于2的,可是循环只走了一次,就直接结束了。


我的第一反应是,也许在循环体中,array的长度被改变了,但看了下doSomething方法,并没有改变数组长度的代码。

当以为真的灵异事件出现了的时候,我突然发现一个小问题:循环变量没有用var关键字定义.我们知道,当浏览器遇到JS的赋值表达式的时候,会先从内到外检查每个Scope里面有没有存在这样的变量,如果都没有,则直接创建一个全局的变量.

问题就出在这里,这位同事没有注意到这点,写循环代码的时候,一律是直接写变量名,这就导致其实每次循环都在用同一个全局变量,而上面的doSomething方法,正好也有一个变量为i的循环体,于是当代码从doSomething方法返回的时候,i变量已经在里面被循环到了一个非常大的数字,明显大于array.length,自然也就不会继续走循环体的内容了.



总结的说,写JS代码要严格按照规范,定义变量的时候一律用VAR来明确,这样提高了代码的可读性,也不会出现这些不可预期的错误了。