Javascript 谷歌浏览器&x27;在alert()函数上的不可预测行为

Javascript 谷歌浏览器&x27;在alert()函数上的不可预测行为,javascript,google-chrome,dom-events,settimeout,alert,Javascript,Google Chrome,Dom Events,Settimeout,Alert,正如您所看到的,当Google Chrome的事件队列中由setTimeout()函数填充时,类似于alert()的阻塞类函数会产生其输出不按顺序,基于以下代码: for (var i = 1; i <= 6; i++) { (function(index){ setTimeout(function() { alert(index) }, 100); })(i); } 对于(var i=1;i通常,期望在任何给定时刻(例如,毫秒精度)只有一个执行槽是有道理的,并且

正如您所看到的,当Google Chrome的事件队列中由
setTimeout()
函数填充时,类似于
alert()
的阻塞类函数会产生其输出不按顺序,基于以下代码:

for (var i = 1; i <= 6; i++) {

 (function(index){ 

     setTimeout(function() { alert(index) }, 100);

 })(i);

}

对于(var i=1;i通常,期望在任何给定时刻(例如,毫秒精度)只有一个执行槽是有道理的,并且在该时刻发生的任何事件(如
setTimeout
callbacks)都应该在一个队列中。这似乎是OP的期望

然而,没有任何东西需要浏览器以这种方式工作,而且事情的日程安排方式要复杂得多,而且浏览器也会有所不同

所以,最好的办法是永远不要依赖于任何两个事件的相对顺序,不管你认为它们应该是可预测的


我在这里有一篇关于计时器的特殊性质和我(类似)对计时器的失望的存档博文:

分别说:为了清楚起见,你告诉chrome执行6次
alert()
100毫秒后同时运行。你期望什么?我期望它们像其他浏览器一样按顺序打印…那么你的逻辑是错误的。期望计算机同时执行多个任务是很奇怪的(js中没有多线程)。您需要将循环移到setTimeout内才能获得预期的结果。opera也有此问题