同步: 同一時間一次做一件事
非同步:同一時間處理不只一件事
- JavaScript 並沒有多執行緒,在JS非同步指的是程式所執行的先後順序的差異
- Event Loop 將「費時較久」或「須等待事件才能啟動」的任務往後安排,因而能打造流暢的使用者體驗
Event Loop
Call Stack(執行堆疊):
- 後進先出( LIFO = Last In, First Out)
- 會依序執行函式:從全域環境開始,逐一把各個函式推(push)至執行堆疊的最上方,並從最後進入的函式開始執行。當函式結束後(return),將此函式抽離(pop off)堆疊
Callback Queue ( 佇列 ):
- 先進先出( FIFO ),也被稱為Task Queue、Event Queue
- Web APIs ( ex: Document DOM , Ajax , setTimeout , console.log)都會先被丟去Callback Queue 等Call Stack內東西執行完再執行Callback Queue ( setTimeout 設定時間到了才會被丟進去 )
Event Loop ( 事件迴圈 ):
無時無刻都在執行程式,判斷Call Stack 是否是空的,再去檢查Event Queue ,若有函式等待執行,就將這些函式從Event Queue依序到主執行環境並執行
