Javascript : Event Queue & Event Loop

更新 發佈閱讀 7 分鐘

前言

這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。

setTimeout(function(){console.log('delay 0 sec')}, 0)
console.log('Hello!')

透過兩天左右的閱讀資料讓自己對JS在同步與非同步有更多概念,由於有許多專有名詞,因此會先針對各專有名詞作介紹,再敘述自己的看法,最後提供這次參考的網路資源

走入非同步之前

執行環境(Execution Context)

Javascript被執行的地方,在Chrome裡,就是由V8 Engine提供此環境,任何程式碼被執行與讀取的地方都是執行環境,其中又可分為下列三種類型:

  • 全域執行環境 : 預設的執行環境,也就是一開始載入JS檔案的執行環境就是全域執行環境,不在任何函式裡面的程式碼就是在全域執行環境,其功用除了創造全域變數,還會進行記憶體的指派。
  • 函式執行環境 : 就如字面上的意思,即函式被呼叫執行的環境,此執行環境可存在很多個,須注意的是其並不會產生全域物件。
  • eval函式執行環境 : eval對開發者來說是非常方便的函式,可以透過字串方式執行JS,需注意的是如透過EVAL綁定的資料未經過適當編碼與驗證,可能造成注入攻擊的產生,因此現在也較不被推薦使用,甚至在CSP(Content Security Policy,可看成Server回送給Cliet端的Http header裡面的一種安全規範)裡面已經被預設為禁止使用。
執行環境堆疊 (Execution stack)

上面提到函式執行環境可能有很多個,每一個函式被呼叫就會產生一個與之對應的執行環境,此時會透過「堆疊」這種資料結構來儲存函式執行環境,為一種「後進先出」的資料結構。

raw-image
單線程 (Single-Thread)

一次只能做一件事情,如果有很多事情就會進行排隊,再逐一執行。

非同步(Asynchronous)

即為同一時間可以處理不只一件事情(註: 其他事情亦非同時進行),這在串接第三方API教材的時候就有用到,利用Ajax可以讓瀏覽器向server送出請求時,不需要等待結果仍然可以處裡其他事情,待之後收到response之後,新的內容可以隨時更新至網頁,這也是為什麼瀏覽Facebook、Gmail的時候不需要看到網頁一直重新整理。

Javascript Runtime Environment (JRE)

JRE即為Javascript執行的環境,最常使用的runtiime就是瀏覽器。我們在宣告函數時,使用到的let、const、function、if else,這些都是Javascript的一部分,但其實之前常常使用到的DOM、console.log、這些其實都不是Javascript,而是瀏覽器這個runtime開放給 Javascript 的 API。也就是說不同的runtime會提供不同的東西,例如瀏覽器的DOM就不能再Node.js執行。

研究分享

Javascript是一個同步的程式語言,代表同一時間只做一件事情,也就是一次只跑一段程式碼。但想想如果我們在讀取Facebook網頁,JS除了要渲染畫面還要透過Http請求跟後端拿資料,但如果文章資料很多的時候,在取得所有資料前就都會無法執行其他任務,造成Blocking的現象,因此JS其實也是有非同步執行的能力,讓使用者瀏覽網頁更為順暢。至於如何處理「同步」與「非同步」的動作呢,就要透過我們今天的主角 —Event Queue、 Event Loop。

上面的名詞解釋曾提到DOM其實不算Javascript語言,而是瀏覽器提供的API,讓我們使用者可以在開發時直接使用,其較常使用的API有操作DOM節點的API — document.querySelector、計時的API — setTimeout、 AJAX相關 — XMLHttpRequest。這些由runtime提供的API,不會影響主執行環境的運行,讓網頁可以同時做很多事情(非同步),而這些非同步的行為要如何進行排序呢,即透過Event Queue。Event Queue專門用來執行非同步的函式,等整個主執行環境運行結束以後,才開始依序執行事件儲列裡面的函式,屬於「先進先出」的資料結構

setTimeout(function(){console.log('delay 0 sec')}, 0) 
console.log('Hello!')

因此上述程式碼可看成,Javacript 引擎執行到瀏覽器提供的setTimeout函式時並不會真的停下來,過0秒馬上執行console.log('delay 0 sec'),是在過0秒之後將此函數放到Event Queue,這就像一個待辦清單,裡面的程式不會馬上執行,要所有的全域執行環境與函式執行環境結束後,才會開始執行Event Queue的內容。那要如何知道主環境都已經執行完程式了呢,就是透過Event loop。Event loop可以看成一個無時無刻都在執行的程式,會不斷監聽程式是否全部執行完成,如果環境堆疊是空的,就會去檢查Event Queue是不是有函式待執行,並將Queue的函式移到Stack執行這些「待辦清單」

raw-image

參考資源

  1. ALPHA Camp教材
  2. [筆記] 理解 JavaScript 中的事件循環、堆疊、佇列和併發模式(Learn event loop, stack, queue, and concurrency mode of JavaScript in depth) ~ PJCHENder<br>那些沒告訴你的小細節
  3. 從「為什麼不能用這個函式」談執行環境(runtime) - Huli
  4. JavaScript 原力覺醒 - 成為絕地武士之路 :: 第 11 屆 iThome 鐵人賽
  5. Understanding Event Loop, Call Stack, Event & Job Queue in Javascript | by Rahul Sagore | Medium
  6. 所以說event loop到底是什麼玩意兒?| Philip Roberts | JSConf EU - YouTube
留言
avatar-img
Blockcyber的沙龍
2會員
15內容數
紀錄轉職路上的點點滴滴
Blockcyber的沙龍的其他內容
2023/01/18
Introduction to WebRTC 由於之後想要做的專題是跟即時視訊相關,在開始作業前想對webrtc有些基本的了解,結果就是一踏入了解就發現這個水深的可怕,之後每天除了寫一點go,也會花時間學習這個協定。WebRTC是個用於瀏覽器之間溝通的協定,透過NAT Traversal(STUN、
Thumbnail
2023/01/18
Introduction to WebRTC 由於之後想要做的專題是跟即時視訊相關,在開始作業前想對webrtc有些基本的了解,結果就是一踏入了解就發現這個水深的可怕,之後每天除了寫一點go,也會花時間學習這個協定。WebRTC是個用於瀏覽器之間溝通的協定,透過NAT Traversal(STUN、
Thumbnail
2023/01/17
Stress testing 一早起床發現昨天辛苦整天網站又不能跑了,去看error.log發現原來是有其他服務使用到了80port,造成根本監聽不到,再去找找看是那些服務,結果可能是apache2使用到,直接怒sudo service apache2 stop,網站就恢復正常了。 今天除了再多熟悉
Thumbnail
2023/01/17
Stress testing 一早起床發現昨天辛苦整天網站又不能跑了,去看error.log發現原來是有其他服務使用到了80port,造成根本監聽不到,再去找找看是那些服務,結果可能是apache2使用到,直接怒sudo service apache2 stop,網站就恢復正常了。 今天除了再多熟悉
Thumbnail
2023/01/16
What the hack? 昨天信誓坦坦想說要將每天學習心得做一點紀錄,結果今天只做一件事,就是要把網站加上SSL憑證,再到Nginx做設定,以為一小時內就搞定的事情就處理了一整天...,可能是沒有分號、可能是url少了/符號、可能是沒有做port的導向、也可能檔案路徑設定錯誤,真的心中各種不甘,
Thumbnail
2023/01/16
What the hack? 昨天信誓坦坦想說要將每天學習心得做一點紀錄,結果今天只做一件事,就是要把網站加上SSL憑證,再到Nginx做設定,以為一小時內就搞定的事情就處理了一整天...,可能是沒有分號、可能是url少了/符號、可能是沒有做port的導向、也可能檔案路徑設定錯誤,真的心中各種不甘,
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
在傳統開發的過程中,很容易會搞混一般的 this 和箭頭函式(arrow function)中的 lexcial "this" 兩者的差異。本文就以實際的例子來說明各自的差異,以及在未來使用時需要注意哪一些細節。
Thumbnail
在傳統開發的過程中,很容易會搞混一般的 this 和箭頭函式(arrow function)中的 lexcial "this" 兩者的差異。本文就以實際的例子來說明各自的差異,以及在未來使用時需要注意哪一些細節。
Thumbnail
Web Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。 javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免
Thumbnail
Web Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。 javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免
Thumbnail
執行以上程式碼,然後看到了這個結果: 為什麼「延遲0秒」的函式寫在上方,但在console印出的結果,它還是被排在第二順位? 利用AC教材提供的youtube演講連結一窺究竟: 演講提供了更多JS的細節概念,身為JS新手的我還在消化,但若針對教案提出的問題來回答,加上利用google大神查到MDN的
Thumbnail
執行以上程式碼,然後看到了這個結果: 為什麼「延遲0秒」的函式寫在上方,但在console印出的結果,它還是被排在第二順位? 利用AC教材提供的youtube演講連結一窺究竟: 演講提供了更多JS的細節概念,身為JS新手的我還在消化,但若針對教案提出的問題來回答,加上利用google大神查到MDN的
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
promise是ES6才有的,它是一種非同步的技術,使用它除了可以在background處理一些事情以外,還可以增加程式碼的可維護性。
Thumbnail
promise是ES6才有的,它是一種非同步的技術,使用它除了可以在background處理一些事情以外,還可以增加程式碼的可維護性。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News