闭包中,seTimeout中alert(i),为什么会乱序?

一个很经典的闭包题

for (var i = 1; i <= 5; i++) {
   (function a(i) {
       setTimeout(function() {
           alert(i);
       }, 1000);
   })(i);
}

按理说,应该弹出1 2 3 4 5 ,但是实际弹出的却是乱序的。
换成console.log(i)就是1 2 3 4 5。
这是为什么呢?

阅读 1.6k
1 个回答

因为alert会阻塞进程
第一个弹出的必定是1,弹出的时候如果你不点击确定,那么就回一直阻塞着,而这时所有的后续代码和回调函数都不会在执行。

同步代码执行完成后,后生成5个定时器,在弹出1等待你点击确定时,后面的所有的定时器都已经准备好了,所以是乱序的

console函数不会阻塞,所以按照顺序执行的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题