跳至主要内容

請說明 JavaScript 中 同步 synchronous 與非同步 asynchronous 的差異是什麼?

同步 synchronous

JavaScript 中同步的概念是指程式碼的執行會依照順序進行,必須等到前一個任務完成後才能執行下一個任務。但是由於 JavaScript 是單一執行緒的程式語言,運行同步程如果其任務執行時間過久很可能會阻塞,在瀏覽器中會出現空白或凍結的情況,這會導致使用者體驗不佳。

console.log("Start");
for (let i = 0; i < 1000000000; i++) {} // 模擬一個耗時的同步任務
console.log("End");

這個例子說明了 for 迴圈是一個耗時的同步任務。在執行該迴圈時,瀏覽器將被阻塞,直到任務完成後才會執行 console.log('End')

非同步 asynchronous

非同步的程式碼不會阻塞主執行緒,當程式碼遇到非同步任務時,會先將任務交到交給瀏覽器或 Node.js 的背景進行處理,並繼續執行後續的程式碼。而不是等待非同步任務完成。當非同步任務完成後,會通過 callbackPromiseasync/await 來通知 JavaScript 主執行緒,然後再執行相應的回應操作。這有助於提高程式碼的效率和效能。

console.log("Start");
setTimeout(() => {
console.log("Async Task Complete");
}, 1000); // 模擬一個 1 秒後完成的非同步任務
console.log("End");

這個例子會先印出 StartEnd,然後再印出 Async Task Complete。這是因為 setTimeout 是一個非同步任務,當遇到 setTimeout 時,會將任務交給瀏覽器背景進行處理,並繼續執行後續的程式碼。

總結

特性差異同步 (Synchronous)非同步 (Asynchronous)
執行順序按照程式碼的順序,逐行執行可以在執行其他程式碼的同時處理背景中的非同步任務
阻塞任務執行時會阻塞後續程式碼任務執行時不會阻塞後續程式碼
應用場景資料處理、簡單邏輯運算呼叫 http request、計時器、事件監聽器、檔案讀取、資料庫查詢等
實現方式順序執行非同步函式、Promiseasync/await、事件監聽器、setTimeout