[JavaScript] 究竟什麼是Event loop?

閱讀時間約 3 分鐘
setTimeout(function(){console.log('delay 0 sec')}, 0)
console.log('Hello!')
執行以上程式碼,然後看到了這個結果:
圖片來源:AC教材
為什麼「延遲0秒」的函式寫在上方,但在console印出的結果,它還是被排在第二順位?
利用AC教材提供的youtube演講連結一窺究竟:
演講提供了更多JS的細節概念,身為JS新手的我還在消化,但若針對教案提出的問題來回答,加上利用google大神查到MDN的文件,大致可以回答。
JavaScript 的並行模型(concurrency model)是基於「事件循環(event loop)」。
視覺化呈現(Visual representation)
from MDN
堆疊(Stack)
呼叫函式(Function)會形成一個 frame 的堆疊。
function foo(b) {
  var a = 10;
  return a + b + 11;
}
function bar(x) {
  var y = 3;
  return foo(x * y);
}
console.log(bar(7));
當呼叫 bar 時,會產生一個含有 bar 的參數及區域變數的 frame,而在 bar 呼叫了 foo 時,含有 foo 參數及變數的第二個 frame 就會被置於堆疊的最上面。當 foo 回傳後,最上面的 frame 會被抽離堆疊(僅留下 bar 的呼叫 frame)。然後當 bar 返回之後,堆疊就會清空。
堆積(Heap)
物件被分配在一個堆積中,一個只表示記憶體中的一個無結構的大區域。
佇列(Queue)
JavaScript 執行環境包含一個訊息佇列,裡面是待處理的訊息,其中每個訊息都與一個 function 相關聯。當堆疊中有足夠空間時,會從訊息佇列拿取一個訊息進行處理,處理過程包含了呼叫相關聯的 function。只有當堆疊清空時,該訊息才算是完成處理。

事件循環(Event Loop)

第一行console程式碼被執行,排到stack上,很快的被印出。
第二行的setTimeout函式並不在V8引擎中運作,在瀏覽器之下必須類似由外頭呼叫的方式進行,其他像DOM、AJAX也都為此方式進行。呼叫後不會直接被推到stack區,會先在webapis區等待設定的延遲秒數,
此時第三行的console也會被推到stack區,跟著馬上被印出。此時setTimeout函式還在等待時間。
時間到達設定秒數後,setTimeout函式內要執行的事情會被放到task queue區,此queue必須要等到stack區完全被清空,才會往stack區堆放執行。
此狀況即使把延遲秒數設定為0依然成立,原因為:
「零延遲」並非意味著回呼函式(callback function)會在 0 毫秒之後立刻執行。當使用延遲 0 毫秒參數來呼叫 setTimeout (en-US) 函式並非是程式會過了該段時間就會執行,而是會參考佇列中等待的訊息數量。 在下面範例中,「this is just a message」會寫在 setTimeout 的回呼訊息被執行之前,因為該時間段參數是要求執行環境處理所需的最少等待時間,而非一個保證時間。
由於console.log走的路徑和setTimeout不同,造成即使先寫出setTimeout程式碼,印出的順序依然會以單純直接console.log為先,setTimeout為後,無論延遲秒數的設定為何。
avatar-img
4會員
5內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
SUPOAN的沙龍 的其他內容
很感謝Andy和Bible兩位在日本工作的前輩,分享海外工作的一些觀念跟他們各自的人生經歷,真的獲益匪淺。 首先Andy先點出了聊到出國工作,哪些問題先必須問問自己的: Why: 為什麼要出國? What: 想要得到什麼?哪個產業?做什麼工作? Where: 去哪個地區?哪個城市?哪間公司? 語言
先說學期2-1完課的整體感覺: 非常精彩刺激!
從一開始的JavaScript,到後面HTML和CSS,雖之前有稍微碰過一點其他線上課程的內容,但AC系統性的教學,一個單元一個單元循序漸進的上課方式滿適合我的,有一種在打遊戲破關的感覺,非常享受。 已經報名學期二了,期望自己在學期二能夠維持學習進度,持續精進! 謝謝AC!
很感謝Andy和Bible兩位在日本工作的前輩,分享海外工作的一些觀念跟他們各自的人生經歷,真的獲益匪淺。 首先Andy先點出了聊到出國工作,哪些問題先必須問問自己的: Why: 為什麼要出國? What: 想要得到什麼?哪個產業?做什麼工作? Where: 去哪個地區?哪個城市?哪間公司? 語言
先說學期2-1完課的整體感覺: 非常精彩刺激!
從一開始的JavaScript,到後面HTML和CSS,雖之前有稍微碰過一點其他線上課程的內容,但AC系統性的教學,一個單元一個單元循序漸進的上課方式滿適合我的,有一種在打遊戲破關的感覺,非常享受。 已經報名學期二了,期望自己在學期二能夠維持學習進度,持續精進! 謝謝AC!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
工作上固定頻率會收到User提供的設定需求資訊,檔案大多為excel的格式.xlsx或.xls,需要擷取內容的參數資訊,轉換撰寫sql語法寫入資料庫進行操作。 既然格式都是固定的,何不動手寫個小工具,一鍵完成轉換呢?
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中函數的基本結構和使用方法,包括函數聲明、函數表達式、箭頭函數和匿名函數的定義方式,以及函數的呼叫、參數使用和返回值的處理方式。透過了解這些函數的基本概念和用法,可以幫助讀者更靈活地編寫和理解JavaScript代碼。
Thumbnail
JavaScript (簡稱 JS) 是具有一級函數的輕量級、直譯式或即時編譯的程式語言。它因為用作網頁的腳本語言而大為知名,但也用於許多非瀏覽器的環境,像是 Node.js 等。由於 JavaScript 語法上的一些缺點,軟體工程師們又設計出了 CoffeeScript、TypeScript 和
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
工作上固定頻率會收到User提供的設定需求資訊,檔案大多為excel的格式.xlsx或.xls,需要擷取內容的參數資訊,轉換撰寫sql語法寫入資料庫進行操作。 既然格式都是固定的,何不動手寫個小工具,一鍵完成轉換呢?
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中函數的基本結構和使用方法,包括函數聲明、函數表達式、箭頭函數和匿名函數的定義方式,以及函數的呼叫、參數使用和返回值的處理方式。透過了解這些函數的基本概念和用法,可以幫助讀者更靈活地編寫和理解JavaScript代碼。
Thumbnail
JavaScript (簡稱 JS) 是具有一級函數的輕量級、直譯式或即時編譯的程式語言。它因為用作網頁的腳本語言而大為知名,但也用於許多非瀏覽器的環境,像是 Node.js 等。由於 JavaScript 語法上的一些缺點,軟體工程師們又設計出了 CoffeeScript、TypeScript 和