鍍金池/ 問答/HTML/ 閉包中,seTimeout中alert(i),為什么會亂序?

閉包中,seTimeout中alert(i),為什么會亂序?

一個很經(jīng)典的閉包題

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

按理說,應(yīng)該彈出1 2 3 4 5 ,但是實際彈出的卻是亂序的。
換成console.log(i)就是1 2 3 4 5。
這是為什么呢?

回答
編輯回答
艷骨

因為alert會阻塞進(jìn)程
第一個彈出的必定是1,彈出的時候如果你不點擊確定,那么就回一直阻塞著,而這時所有的后續(xù)代碼和回調(diào)函數(shù)都不會在執(zhí)行。

同步代碼執(zhí)行完成后,后生成5個定時器,在彈出1等待你點擊確定時,后面的所有的定時器都已經(jīng)準(zhǔn)備好了,所以是亂序的

console函數(shù)不會阻塞,所以按照順序執(zhí)行的

2018年5月18日 08:01