JS是個單執行緒的語言,也就是程式在執行時同一時間只能由一個主線程處理任務,主因是JS在瀏覽器執行,如果是多線程處理,很難保證所有操作的一致性,因此後來Web worker的出現允許我們將耗時計算且不含DOM 元件的代碼放入背景執行以達到不阻塞主線程的功用並提高執行效率。

那麼JS在執行時如何在單線程的情況下處理I/O, api請求等較耗時的任務又能達到非阻塞的效果?這裡就要提到Event Loop(事件循環)的概念:JS在執行腳本時,會將同步執行的程式碼依序加入Call Stack(呼叫堆疊)中,為後進先出,如果當前處理的是一個方法,JS會在呼叫堆疊中建立一個方法的執行環境,進入環境中執行,執行完後銷毀並回到上一個方法的環境執行直到堆疊中無任務為止。如果遇到異步任務返回結果,JS會將此請求放入Task Queue(事件隊列),等到堆疊中沒有方法要執行,才會檢查事件隊列是否有任務要執行,再將回調函數放入堆疊。

文章標籤

龍眼的歡樂人生 發表在 痞客邦 留言(0) 人氣()