【第1790期】圖解Event Loop

2021-03-02 前端早讀課

前言

通過生動形象的動圖講解事件循環的一些基本概念。今日早讀文章由@Logan70翻譯授權分享。

正文從這開始~~

事件循環(Event Loop),是每個JS開發者都會接觸到的概念,但是剛接觸時可能會存在各種疑惑。我是一個視覺型學習者,所以打算通過gif動圖的可視化形式幫助大家理解它。

首先我們來看看,什麼是事件循環,我們為什麼要了解它呢?

眾所周知,JavaScript是 單線程(single-threaded) 的,也就是同一時間只能運行一個任務。一般情況下這並沒有什麼問題,但是假如我們要運行一個耗時30秒的任務,我們就得等待30秒後才能執行下一個任務(這30秒期間,JavaScript佔用了主線程,我們什麼都不能做,包括頁面也是卡死狀態)。這都9012年了,不帶這麼坑爹的吧?

好在瀏覽器向我們提供了JS引擎不具備的特性:Web API。Web API包括DOM API、定時器、HTTP請求等特性,可以幫助我們實現異步、非阻塞的行為。

當我們調用一個函數時,函數會被放入一個叫做調用棧(call stack,也叫執行上下文棧)的地方。調用棧是JS引擎的一部分,並非瀏覽器特有的。調用棧是一個棧數據結構,具有後進先出的特點(Last in, first out. LIFO)。當函數執行完畢返回時,會被彈出調用棧。

圖例中的respond函數返回一個setTimeout函數調用,setTimeout函數是Web API提供給我們的功能:它允許我們延遲執行一個任務而不用阻塞主線程。setTimeout被調用時,我們傳入的回調函數,即箭頭函數 ()=>{return'hey'}會被傳遞給Web API處理,然後setTimeout和respond依次執行完畢出棧。

在Web API中會執行定時器,定時間隔就是我們傳入setTimeout的第二個參數,也就是1000ms。計時結束後回調函數並不會立即進入調用棧執行,而是會被加入一個叫做 任務隊列(Task Queue) 的地方。

看到這裡,有些人可能會疑惑:1000ms之後,回調竟然沒有放入調用棧執行,而是被放入了任務隊列,那什麼時候被執行呢?不要急,既然是一個隊列,那就要排排坐,吃果果。

接下來就是我們期待已久,萬眾矚目的 事件循環(Event Loop) 閃亮登場的時刻了。Event Loop的工作就是連接任務隊列和調用棧,當調用棧中的任務均執行完畢出棧,調用棧為空時,Event Loop會檢查任務隊列中是否存在等待執行的任務,如果存在,則取出隊列中第一個任務,放入調用棧。

我們的回調函數被放入調用棧中,執行完畢,返回其返回值,然後被彈出調用棧。

閱讀一時爽,但只有通過反覆練習,將其變為自己的東西後才會一直爽。我們來做個小練習檢測下學習成果,看看下面代碼輸出什麼:

const foo = () => console.log('First');

const bar = () => setTimeout(() => console.log('Second'), 500);

const baz = () => console.log('Third');

bar();

foo();

baz();

相信大家都可以輕鬆給出正確答案。我們一起來看下這段代碼運行時發生了什麼:

bar被調用,返回setTimeout的調用;

傳入setTimeout的回調被傳遞給Web API處理,setTimeout執行完畢出棧,bar執行完畢出棧;

定時器開始運行,同時主線程中foo被調用,列印First,foo執行完畢出棧;

baz被調用,列印Third,baz執行完畢出棧;

500ms後定時器運行完畢,回調函數被放入任務隊列;

Event Loop檢測到調用棧為空,從任務隊列中取出回調函數放入調用棧;

回調函數被執行,列印Second,執行完畢出棧。

關於本文譯者:@Logan70譯文:https://github.com/logan70/Blog/issues/25作者:@Lydia Hallie原文:https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

為你推薦

【第1405期】瀏覽器的 Event Loop

【第993期】總是一知半解的Event Loop

【第1431期】圖解瀏覽器的基本工作原理

相關焦點

  • Event Loop 解疑
    偽代碼global List<Map<FileDescriptor,Callback> queue;class EventLoop {  while(queue.isNotEmpty())  {    event = queue.next();    if(event.fd.ready
  • Event Loop - 事件隊列
    Event Loop定義:event - 事件 loop - 循環,既然叫事件循環,那麼循環的點在哪?
  • Out of the loop?
    here are a few articles that might help those who are out of the loop.If you’re out of the loop, that is, you don’t know what’s going on.The loop refers to, I think, the social circle or circles we belong or don’t belong.
  • Event Loop的規範和實現
    我再次確認了HTML規範,發現雖然有4ms的限制,但是是存在條件的,詳見規範第11點:If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4.並且有意思的是,MDN英文文檔的說明也已經貼合了這個規範。
  • 從一道面試題談談對 EventLoop 的理解
    (也就是執行microtasks隊列裡的任務)7.更新渲染(Update the rendering):可以簡單理解為瀏覽器渲染...8.如果這是一個worker event loop,但是沒有任務在task隊列中,並且WorkerGlobalScope[5]對象的closing標識為true,則銷毀Eveent Loop,中止這些步驟,然後進行定義在Web workers[6]章節的run a worker
  • 看到電子郵件寫「I will keep you in the loop」是什麼意思?
    loop一詞在英文裡是指「環狀物」,舉凡狀似圈圈或是如圓環狀的東西,都可稱為loop。至於身處國際職場的我們,最常看到loop的應該是在英文的電子郵件裡in the loop的片語。把「in the loop」加以衍申,則它還有「在決策圈內」或「處理要務或參與決策的智囊團中人士」之意。例如:Henry Meyer denied that he was in the loop regarding the scandal.
  • 常用圍棋術語總結丨丨動態圖解(第2期)
    大家好,我是白夕,上周,我們總結了一些常用圍棋術語,現在我們來更第2期了。下方是第1期的連結,需要的同學可以自行點擊閱讀哦。常用圍棋術語總結丨丨動態圖解(第1期)大家只要在下棋的時候,多使用圍棋術語,自然更容易學會了(未完待續)我們的第2期的圍棋術語總結,就到這裡了,下一期還會繼續更新的。喜歡我們的,可以評論、點讚(在看)、轉發,素質三連,謝謝大家,晚安。
  • 【第1589期】圖解 Map、Reduce 和 Filter 數組方法
    juejin.im/post/5caf030d6fb9a068736d2d7c作者:Una Kravets作者:https://css-tricks.com/an-illustrated-and-musical-guide-to-map-reduce-and-filter-array-methods/校對者:@Endone、@Reaper622為你推薦【第1431
  • 郵件裡in the loop是什麼意思?【商務英語單詞輕鬆學·第24課】
    free loop最常見的意思:放在網上可以供免費下載的音樂片段。——也很有可能歌名裡的free loop和以上所說的意思沒有任何關係,因為無論是歌詞,還是歌名都帶著作者個人非常主觀的情感。所以,這首歌名free loop具體的含義,每個人都會有不同的解讀。
  • 第41期|正在用的書之《圖解數學》
    今天介紹第一本——《圖解數學》。這本書是一本工具書。英國DK公司的作品,它用圖形的方式,來講英國小學以及初中的所有數學知識。這本書用了二年多了,也是目前唯一一本我和雨點每學期必翻的書。那它到底是因為什麼吸引了我們呢?
  • 適合春天的披肩Banksia Shawl 鉤針圖解
    還有別的顏色的設計者Dedri Uys還自己手染了另一個顏色好了最後上圖解Catch the ch-8 loop by making a hdc through the ch-8 loop AND the ch-5 space. Make 2 hdc’s in the same ch-5 space. Hdc in the next 4 st’s.
  • 【東萊遊學記1期】圖解親子關係
    在東萊遊學記第一期《楊氏家訓》活動過程中,參與的孩子與父母有一個環節是「一封家書」,孩子們可以以書信的形式也可以用繪畫的形式向父母表達願望。同樣參與活動的父母也要用一句話去回應自己的孩子。本次參與遊學的孩子大多年齡在4到8歲。每個孩子在一整天的活動中。
  • 美國習慣用語|in the loop
    點擊上面在線試聽今天的音頻,音頻播放器已經支持暫停、快進、後退功能了)聽力參考原文 ↓↓↓今天還是要繼續講在大選期間新聞界常用來報導競選運動的兩個習慣用語,而且今天要說的習慣用語包含一個共同的詞:loop
  • 鉤針圖解-鉤針領子(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 鉤針玩偶圖解-海豹(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 棒針圖解-靠墊(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 棒針圖解-茶壺墊(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 鉤針圖解-六角形毯子(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 鉤針圖解-笑臉坐墊(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop
  • 棒針圖解-披肩(英語)
    英文常用針法及說明(參考)crochethook鉤針,tocrochet鉤,yarn,thread線,chain(ch)鎖針,stitch(st)針/針數,singlecrochet(sc)短針,doublecrochet(dc)長針,halfdoublecrochet(hdc)中長針,treblecrochet(tr)長長針,slipstitch(slst)引拔針,loop