1. 程式人生 > >Javascript的同步、非同步、回撥執行順序

Javascript的同步、非同步、回撥執行順序

在做筆試題的時候,遇到一個很經典的題目,關於setTimeout的輸出結果,先來看一道題目:

for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}
console.log(i);

那麼輸出的結果是什麼呢? 第一種可能的答案:0 1 2 3 4 5 第二種可能的答案:5 5 5 5 5 5 (後面每個5隔一秒輸出) 顯然第二種結果是正確的。 首先看一下一個口令或者說方法: 同步優先、非同步靠邊、回撥墊底 用公式表達就是:同步 => 非同步 => 回撥

現在根據這個口令來分析一下結果: 1)for迴圈和迴圈體外部的console是同步的,所以先執行for迴圈,再執行外部的console.log。(同步優先) 2)for迴圈裡面有一個setTimeout回撥,他是墊底的存在,只能最後執行。(回撥墊底) 那麼,為什麼我們最先輸出的是5呢? for迴圈先執行,但是不會給setTimeout傳參(回撥墊底),等for迴圈執行完,就會給setTimeout傳參,而外部的console打印出5是因為for迴圈執行完成了。