事件循環機制

解答: console.log()是同步任務(便可以當即執行的任務),setTimeout是異步任務(不會當即執行的事件任務)。瀏覽器

常見的異步操做:異步

  • Ajax
  • DOM的事件操做
  • setTimeout
  • Promise的then方法
  • Node的讀取文件

異步任務分爲宏任務和微任務:函數

宏任務:script(全局任務), setTimeout, setInterval, setImmediate, I/O, UI renderingspa

微任務:process.nextTick, Promise.then(), Object.observe, MutationObserver3d

 

因此,對以上的解析是:日誌

  • 從全局任務入口,首先打印日誌 1
  • 遇到宏任務 setTimeout,交給異步處理模塊,咱們暫且先記爲 setTimeout1
  • 再次遇到宏任務 setTimeout,交給異步處理模塊,咱們暫且先記爲 setTimeout2
  • 順序執行,打印日誌 4
  • 此時同步任務已執行完畢,讀取宏任務隊列的任務,先執行 setTimeout1的回調函數,由於定時器的等待時間爲 0秒,因此會直接輸出 2,可是 W3C在 HTML標準中規定,規定要求 setTimeout中低於 4ms的時間間隔算爲 4ms
  • 因爲瀏覽器在執行以上三步時,並未耗時好久,因此當宏任務 setTimeout1執行完時, setTimeout2的等待時間並未結束,因此在 2秒後打印日誌 3,實際上並未等待2秒。

入棧與出棧

解答:棧是先進後出code

相關文章
相關標籤/搜索