1. 程式人生 > >迴圈中加定時器 i的問題

迴圈中加定時器 i的問題

for(var i=0;i<2;i++){
        setTimeout(function(){
            alert(i);
        },0);
}

執行上面的程式碼,大家得到是彈出兩次2;
可能大家心裡在嘀咕了,我這個定時器不是0ms延遲麼?應該彈0,1才對啊。
為什麼會產生這樣的結果呢?

因為JavaScript 是單執行緒執行的,也就是無法同時執行多段程式碼,當某一段程式碼正在執行的時候,所有後續的任務都必須等待,形成一個佇列,一旦當前任務執行完畢,再從佇列中取出下一個任務。這也常被稱為 “阻塞式執行”。

如果程式碼中設定了一個 setTimeout,那麼瀏覽器便會在合適的時間,將程式碼插入任務佇列,如果這個時間設為 0,就代表立即插入佇列,但不是立即執行,仍然要等待前面程式碼執行完畢。而在我們這個demo裡for迴圈就是所謂的前面的程式碼

,定時器執行的時機只能是在for迴圈結束,所以此時的i已經為2了。