今日的目標:
同步(Synchronous)
同步的世界裡,程式碼「一行行照順序」執行。
就像排隊買飲料,前面的人沒點完,你不能動。
console.log("A");
console.log("B");
console.log("C");
輸出結果是:
A
B
C
同步:誰先寫誰先執行
非同步(Asynchronous)
當我們呼叫 setTimeout()、fetch()、addEventListener() 去等「要等的東西」,
這些任務會被交給瀏覽器的其他系統(Web API) 去做。
當它們完成後,會把「回呼(callback)」放回 JS 的任務中,等主線空下來,Event Loop 再安排它執行。
也就是說,JS 會把「需要等的工作」交給瀏覽器或 Web API 幫忙處理,等結果回來再通知你。
就像是點了外送,你點完餐(下指令)後,不用傻傻等外送員回來再繼續幹別的事~
console.log("A");
setTimeout(() => {
console.log("B");
}, 1000);
console.log("C");
結果會是:
A
C
B
非同步:不用等,先繼續跑,結果回來再通知。
JS 只有一條主線(單執行緒),靠 Event Loop 把「外面做完的事」排回來跑。
流程是:
Microtask(微任務)
常見來源
| 類型 | 範例 |
|---|---|
| Promise | .then(), .catch(), .finally() |
Task(巨任務、宏任務)
常見來源
| 類型 | 範例 |
|---|---|
| 計時器 | setTimeout, setInterval |
| 事件回呼 | click, scroll |
| 網路 | XMLHttpRequest, fetch 的底層任務 |
比較
| 類型 | 來源例子 | 執行時機 | 說明 |
|---|---|---|---|
| Task(巨任務) | setTimeout, setInterval, fetch |
主程式與 microtask 全部跑完後 | 下一輪 Event Loop |
| Microtask(微任務) | Promise.then, queueMicrotask |
Task 結束前立即執行 | 優先度更高! |
![]()