关于文章《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了?

转载于:https://my.oschina.net/fuckBAT/blog/324819

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值