成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何玩轉JavaScript的事件循環

開發 前端
聽多了JavaScript單線程,異步,V8,便會很想去知道JavaScript是如何利用單線程來實現所謂的異步的。我參考了一些文章,了解到一個很重要的詞匯:事件循環(Event Loop)。異步在JavaScript的重要性,也意味著理解Event Loop的必要性。

聽多了JavaScript單線程,異步,V8,便會很想去知道JavaScript是如何利用單線程來實現所謂的異步的。我參考了一些文章,了解到一個很重要的詞匯:事件循環(Event Loop)。在這些文章中,有:

  • 阮一峰老師的JavaScript 運行機制詳解:再談Event Loop
  • Philip Roberts的What the heck is the event loop anyway?
  • Erin Swenson-Healey的The JavaScript Event Loop: Explained等。

這些文章都講得非常好,讓我對Event Loop的機制有了大概的了解。

異步在JavaScript的重要性,也意味著理解Event Loop的必要性,不然怎么敢輕易使用setTimeout和setInterval這些咧。

這里我還是通過翻譯一篇文章來解釋Event Loop,原文點這里Willson Mock:What is the JavaScript Event Loop?下邊的圖也都引用自這篇文章。

JavaScript Engine:JavaScript 引擎

截止到目前(原文編寫時間:5 July 2014),在各種JavaScript 引擎的實現里邊,最出名的當屬Google Chrome的V8引擎了,既能在瀏覽器中使用,也能通過NodeJS在服務器端使用。但究竟JavaScript引擎是干什么用的?其實很簡單--它的任務就是遍歷應用中的每一行JavaScript代碼,并且一次執行一行,意味著JavaScript是單線程的。這里***的影響是:如果在JavaScript代碼中有地方會占用大量的時間,那后面的代碼都會被block住。

那么JavaScript引擎怎么知道如何一次處理一行JavaScript代碼?它使用的是一個調用棧call stack。你可以把調用棧比作電梯--***個進電梯的會***一個出電梯,***進電梯的會***出。

看個栗子:

  1. /* Within main.js */ 
  2.  
  3. var firstFunction = function () {   
  4.   console.log("I'm first!"); 
  5. }; 
  6.  
  7. var secondFunction = function () {   
  8.   firstFunction(); 
  9.   console.log("I'm second!"); 
  10. }; 
  11.  
  12. secondFunction(); 
  13.  
  14. /* Results: 
  15.  * => I'm first
  16.  * => I'm second
  17.  */  

下邊是調用棧的情況:

1.Main.js 執行 

 

2.調用secondFunction

 

3.調用secondFunction引起調用firstFunction

 

4.執行firstFunction,輸出“I'm first!”,接著由于firstFunction執行完畢,firstFunction會從調用棧中彈出。

 

5.secondFunction繼續執行,輸出“I'm second!”。接著由于secondFunction執行完畢,secondFunction從調用棧中彈出。

 

6.***,main.js執行完畢,也從棧中彈出。

 

Event Loop:事件循環

了解了call stack在JavaScript引擎中是如何工作了之后,來看下如何使用異步回調函數來避免blocking 代碼。(譯者注:回調函數有多種實現方式,最常見的有:在函數中使用函數作用參數etc。)setTimeout就是使用的回調函數。看個栗子:

  1. /* Within main.js */ 
  2.  
  3. var firstFunction = function () {   
  4.  console.log("I'm first!"); 
  5. }; 
  6.  
  7. var secondFunction = function () {   
  8.  setTimeout(firstFunction, 5000); 
  9.  console.log("I'm second!"); 
  10. }; 
  11.  
  12. secondFunction(); 
  13.  
  14. /* Results: 
  15.  * => I'm second
  16.  * (And 5 seconds later) 
  17.  * => I'm first
  18.  */  

下邊模擬調用棧(在上個栗子的基礎上我們這次推前點)

1....

2.secondFunction調用setTimeout,setTimeout入棧:

 

3.setTimeout執行后,瀏覽器會把setTimeout的回調函數(在這個栗子中是firstFunction)放到Event Table中。Event Table 就是個注冊站:調用棧讓Event Table注冊一個函數,該函數會在5秒之后被調用。當指定的事情發生時,Event Table會將這個函數移到Event Queue。Event Queue其實就是個緩沖區域,這里的函數等著被調用并移到調用棧。

問題來了,什么時候函數會從Event Queue移到調用棧咧?JavaScript引擎依據一條規則:有一個monitoring process(不知翻譯成啥好)會持續不斷地檢查調用棧是否為空,一旦為空,它會檢查Event Queue里邊是否有等待被調用的函數。如果存在,它就會調用這個Queue中***個函數并將其移到調用棧中。如果Event Queue為空,那么這個monitoring process會繼續不定期的檢查。這一整個過程就是Event Loop。

 

4.一旦回調函數加入到Event表中,代碼不會被block住,瀏覽器不會等待5秒之后再繼續處理接下去的代碼,相反,瀏覽器繼續執行secondFunction的下一行代碼,console.log。

 

5.在background,Event Table會持續地監測是否有事件觸發,將函數移到Event Queue中。在這個栗子中,secondFunction執行完畢,接著main.js也執行完畢。

 

6.從回調函數被放入Event Table后5秒鐘,Event Table把firstFucntion移到Event Queue中。

 

7.由于事件循環持續地監測調用棧是否已空,此時它一注意到調用棧空了,就調用firstFunction并創建一個新的調用棧。

 

8.一旦firstFunction執行完畢,調用棧空了,Event Table里也沒有注冊函數,Event Queue也為空。

 

總結

雖然這樣的解釋掩蓋了實際JavaScript引擎、Event Table、Event Queue和Event Loop的具體實現細節,但是對于大部分人來說,我們只需要對JavaScript執行異步函數時會發生什么有個大概的了解即可。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-01-18 08:24:51

JavaScriptMicrotask微任務

2009-03-17 15:36:29

JavaScript循環事件

2009-01-19 09:40:53

JavaScript事件代理事件處理器

2021-05-27 09:00:00

Node.js開發線程

2022-08-18 11:36:16

可視化JavaScript事件循環

2020-12-29 08:21:03

JavaScript微任務宏任務

2021-10-22 08:29:14

JavaScript事件循環

2024-08-26 14:52:58

JavaScript循環機制

2022-07-07 09:12:17

JavaScript線程循環機制

2023-02-26 10:59:51

2021-10-15 09:56:10

JavaScript異步編程

2020-04-26 08:21:43

javascriptVue

2023-03-29 07:37:40

樹狀數組數據結構

2023-02-19 12:44:07

領域事件DDD

2023-01-31 16:43:31

?Node.js事件循環

2017-03-28 21:25:19

無循環代碼JavaScript

2022-03-11 14:59:21

JavaScript數組字符串

2017-10-17 15:40:25

javascript刷新頁面

2011-06-16 14:38:18

JavaScript事件委托

2009-10-20 14:58:15

Javascript事
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久久久久 | 成人国产精品久久久 | 国户精品久久久久久久久久久不卡 | 国产精品成人一区 | 欧美在线a | 91性高湖久久久久久久久_久久99 | 成人激情视频免费在线观看 | 国产精品毛片一区二区在线看 | 欧美精品久久一区 | 免费天天干 | 欧美日韩1区 | 99福利视频导航 | 九九综合 | www.日韩高清 | 草草视频在线播放 | a级毛片国产 | 日韩欧美在线播放 | 亚洲天堂av网 | 欧美日韩精品一区二区三区视频 | 成人综合在线视频 | 久久久精品 | 久久久久久美女 | 精品国产乱码一区二区三区a | 毛片网站在线观看 | 黄色毛片大全 | 一区二区三区四区在线视频 | 国产成人精品免费视频大全最热 | 久久久国产一区二区三区四区小说 | 国产成人精品免高潮在线观看 | 狠狠亚洲 | 欧美在线播放一区 | 91久久| 亚洲一区二区不卡在线观看 | 男女视频免费 | 成人h视频在线 | 国产污视频在线 | 欧美激情在线精品一区二区三区 | 精品成人佐山爱一区二区 | 国产高清久久久 | 亚洲一在线 | 国产在线一区二区三区 |