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

时间: 2024-10-25 18:42:41

关于文章《for循环里面设置setTimeout弹出数据顺序是乱的》的一些问题的相关文章

git需要设置再次弹出输入账号密码

今天在用命令行pull线上代码到本地时遇到一个尴尬的问题,因为新下载的git貌似默认了在pull,push代码时只弹出一次输入账号密码,反正我这里是这样的. 开始在pull线上代码的时候不小心密码输错了,导致拉取失败,再次pull的时候就不弹出重新输入账号密码了,被直接读取上次输入的错密码而导致一直pull不了, 然后百度相关问题都是清一色的设置git不再多次弹出输入账号密码,全是与我相反的问题... 后来经过摸索,终于找到了两种解决办法 1.直接在git命令行输入 git remote add

设置div弹出层显示隐藏效果

----页面div <div id="show_scfsxz"  style="display:none;zindex:1000;position:absolute;left:850px;top:28px;border:1px solid #06c;padding:0px;background:#C7DEF8;"> <br/>       <span>上传方式: <input type="radio" v

设置easyUi弹出窗在弹出框(iframe)中不居中问题

 $("#w").window({     top:($(window).height() - 420) * 0.5,       left:($(window).width() - 480) * 0.5,                });   $("#w").window('open');

Bootstarp学习(二十五)模态弹出框--JavaScript触发时的参数设置

使用JavaScript触发模态弹出窗时,Bootstrap框架提供了一些设置,主要包括属性设置.参数设置和事件设置. 属性设置 模态弹出窗默认支持的自定义属性主要有: 比如你不想让用户按ESC键关闭模态弹出窗,你就可以这样做: $(function(){ $(".btn").click(function(){ $("#mymodal").modal({ keyboard:false }); }); }); 参数设置和事件设置进行介绍. 参数设置: 在Bootstr

使用设置自定义对话框的大小,位置,样式以及设置在安卓桌面上弹出对话框

第一步:创建对话框 MyDialog mydlg=new MyDialog(context); 第二步:获取对话框的window实例,通过window实例来控制对话框出现的位置,大小和弹出时候的场景 Window dlgwindow=mydly.getWindow(); 设置对话框最终显示位置 dlgWindow.setGravity(Gravity.TOP); 参数可以是Gravity.TOP(顶部),Gravity.BUTTON(底部),Gravity.LEFT(左边),Gravity.RI

转 android 从底部弹出一个popuwindow,渐入渐出效果。我这里是用在购物车需要选择购买选项的操作。

最近要改客户端,需要实现一个从底部弹出的popuwindow,像我这种渣渣android技术,能整出popuwindow但是整不出动画,百度之,记录一下. 从下面这个地址转的 http://blog.csdn.net/yxhuang2008/article/details/42617805 最近因为要用到PopupWindow,所以,就在网上搜索了一下,发现挺多关于这样的文章,现在我把它们整理了一下. 1.Android PopupWindow 的使用技巧,http://www.cnblogs.

在弹出的菜单中模仿微信的右上角

采用PopupWindow在弹出的菜单右上角实现仿微信. 效果如下面的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3lpX3RkY3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > popupWindow代码例如以下: import java.util.ArrayList; import java.util.HashMap;

jQuery 弹出窗口的形式一直是具体案件的中心

在网上查 多 不是不符合无效;因此,一些自己总结,解决这个问题 原则: 常见问题: 弹出层居中了,背景也是半透明的 可是发现一拉动滚动栏立即就露馅了发现背景仅仅设置了屏幕所在段,其它部分都是原来的样子,并且弹出层由于滚动栏移动不见了 这是网上大部分弹出层出现的普遍问题 问题解决的方法,有三种 1.利用IE6的漏洞,_top和使用css expresstion表达式 长处:不会抖动,通过计算得出位置,大部分浏览器都能够使用 缺点:不推荐使用css expresstion由于在做不论什么事件时css

自定义PopupWindow弹出框(带有动画)

使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow 1 public class LostPopupWindow extends PopupWindow { 2 public Lost lost; 3 public void onLost(Lost lost){ 4 this.lost = lost; 5 } 6 private View conentView; 7 8 public View getConentView() { 9 return cone