什麼是事件迴圈

JavaScript執行環境以單一執行緒,把等待中的工作一個一個取出執行的機制。由點擊、計時器、通訊完成等所產生的工作會作為任務排入佇列,目前的程式碼結束後,事件迴圈再取出下一個任務。Promise的處理(微任務)會在每個任務結束後、下一個任務之前全部執行。若一件工作持續很久,其他事件的處理與畫面的繪製都會停住。

日文名稱: イベントループ

「事件迴圈」出現在1領域的1道練習題中(Web技術基礎等)。

這個名詞所屬的領域: Web技術基礎

執行的順序

例如在 console.log('A') 之後,以setTimeout預約顯示B、以Promise的then預約顯示C,最後執行 console.log('D'),顯示的順序為A、D、C、B。同步的程式碼先全部執行,接著執行微任務C,最後才執行任務B。即使setTimeout指定0 ms,也不會立即執行。

畫面卡住的原因

瀏覽器的主執行緒負責執行JavaScript、處理點擊等事件,以及繪製畫面。若一次執行需要數秒的計算,這段期間事件迴圈無法取出下一個任務,因此按鈕沒有反應,畫面也不會更新。繁重的計算要以Web Worker移到別的執行緒,或切成小塊一點一點執行。

非同步的輸入輸出

通訊或檔案讀寫時,等待完成期間不讓執行緒停住,而是先登錄完成時要呼叫的處理(回呼函式或Promise)。完成後該處理會作為任務排入佇列,由事件迴圈依序執行。Node.js這類伺服器端的執行環境也是相同的概念,以單一執行緒執行JavaScript,同時處理許多連線。

常見問題

setTimeout指定0 ms會立即執行嗎?

不會。經過指定時間後才作為任務排入佇列,要等目前執行中的程式碼與在那之前排入的微任務結束後才會執行。0 ms的意思是「盡快,但在目前的工作之後」。

JavaScript能平行計算嗎?

網頁的JavaScript本身在單一主執行緒上執行,但使用Web Worker就能在別的執行緒平行執行指令碼。Worker無法直接存取DOM,因此要與主執行緒交換訊息來傳遞結果。

解析中的「事件迴圈」

出現「事件迴圈」的題目(1題)

  1. 在瀏覽器中執行上方的JavaScript時,主控台顯示文字的順序,下列何者正確?

相關名詞

佇列 反向代理 文件物件模型(DOM) 同源政策 伺服器端算繪(SSR) 跨來源資源共用(CORS) Cookie HTTP(超文字傳輸協定) HTTP方法 HTTP狀態碼

前往名詞解釋列表