首页 > 代码库 > 关于文章《for循环里面设置setTimeout弹出数据顺序是乱的》的一些问题
关于文章《for循环里面设置setTimeout弹出数据顺序是乱的》的一些问题
代码1:for(var i=0;i<10;i++){
(function(index){
setTimeout(function (){
alert(index);
},1000);
})(i);
}
代码2:
for(var i=0;i<10;i++){
(function(index){
setTimeout(a(index),1000);
})(i);
}
function a(param){
alert(param);
}
为什么代码1不能控制顺序,弹出来的数字顺序是乱的 。代码2的可以
下面的评论是:
(1)在2里面,你的写法根本没用到settimeout定时器,所以相当于在循环体里面直接call a(),并且因为alert的阻塞作用,也就阻塞了循环,所以就是一步一步的执行循环了。
在1里面,确实启动了10个定时器,这个10个定时器在1秒后左右被唤醒,猜测这个地方有cpu竞争存在或者其它的浏览器内部优化逻辑,不保证严格的时间一致性。
(2)代码2使用了闭包与setTimeout,一般来说,使用闭包就可以解决这个问题
因为你使用setTimeout,也就是延时操作,js引擎空闲下来才会执行的代码
直到for循环会执行完毕之后js引擎空闲了,发现还有很多延时任务等着执行,此时的i已经不是预想的i了,而且都是最后相同的!
这时候会按照进入延时进入的顺序队列执行,而闭包保证了i参数的唯一与正确性。
第一个问题是评论1里面的根本没用到settimeout定时器是什么意思?还有评论2里面的此时的i已经不是预想的i了?
关于文章《for循环里面设置setTimeout弹出数据顺序是乱的》的一些问题