博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于文章《for循环里面设置setTimeout弹出数据顺序是乱的》的一些问题
阅读量:7014 次
发布时间:2019-06-28

本文共 715 字,大约阅读时间需要 2 分钟。

hot3.png

代码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

你可能感兴趣的文章
Win8系统108个运行命令 你能记住多少?(转)
查看>>
网站主机
查看>>
Connection封装
查看>>
如何判断 Linux 是否运行在虚拟机上
查看>>
MySQL中PreparedStatement sql中in的引号问题
查看>>
趣事:据说只有程序员才能看懂的笑话,祝新的一周愉快!
查看>>
Python3 迭代器与生成器
查看>>
云计算成增收引擎,营收创上市以来新高
查看>>
PHP 常用的header头部定义汇总
查看>>
Java heap space 解决方法
查看>>
通过注册表开通关闭局域网共享
查看>>
Asp.net 导入导出Excel
查看>>
Oracle 10.2.0.4(5)EM不能启动的解决方案
查看>>
AngularJS—— 独立作用域
查看>>
Web开发(初级)- CSS基础
查看>>
linux命令行编辑快捷键
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
(转)IntelliJ IDEA 使用JSTL标签库(IDEA 加载 tld文件)
查看>>
AndroidStudio开发工具快捷键整理分享
查看>>