[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為後,無論延遲秒數的設定為何。
4會員
5內容數
留言0
查看全部
發表第一個留言支持創作者!
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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 和