JS-event-loop

本文為AC 2–2學習能力驗收作業,筆記內容與截圖皆整理自以下影片

Image


Key words: Event loop, call stack, task queue

首先,要了解Javascript是一個在瀏覽器裡運作的語言。
概念如下圖:
Image

影片3:00處

JS是單執行緒(single thread)語言,一次只能做一件事情,要執行的程式碼會堆疊在一個地方(call stack),一次執行一組程式碼(影片4:00)。當有要跑很久或是需要等待的程式碼,就會阻塞(blocking)(影片7:23),不會同時執行下一段程式碼。

但事實上瀏覽器可以同時(concurrently)處理很多事情(影片11:50),是因為瀏覽器是多執行緒的,除了JS之外,還處理各種API,例如事件觸發(這學期熟悉的DOM.addEventListener)、ajax請求外部資料、定時觸發(setTimeout等),另外也要定時(每多少毫秒)重新渲染(render)畫面。

這些瀏覽器會執行的工作,其中事件觸發、定時觸發、請求外部資料,屬於非同步(asynchronous)事件。在AC 2–2課程有舉例,例如請求外部資料,有可能遇到外部資料來源的伺服器回應很慢,甚至掛了不回應的狀況,所以如果所有工作都放到同一個call stack中,在等待伺服器回應的時間,我們在瀏覽器就無法執行其他事情。

為了避免這個問題,瀏覽器會將非同步事件裡要處理的事情(稱callback function),放到工作佇(ㄓㄨˋ)列(task queue)裡,而事件迴圈(event loop)的工作,就是先檢查call stack是否有任務,若沒有,若此時task queue有任務,就把task queue裡的callback function依序放到call stack裡執行。

影片後半段講者使用動畫來呈現運行順序,也模擬各種情況(setTimeout, forEach, click event, scroll event, browser render),非常淺顯易懂。