首页 > 代码库 > 关于文章《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弹出数据顺序是乱的》的一些问题