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

事件循環機制:JavaScript被設計為單線程,那如何做到異步的呢?

開發 前端
JavaScript既然被設計為單線程,是如何做到異步的呢?這時就用到了JavaScript的事件循環機制。

JavaScript是單線程的語言,單線程是指所有的程序路徑按照一定的順序執行,只有前面的程序執行了,后面的程序才會執行。

也就是說在同一時間,JavaScript只能做一件事情,為了協調瀏覽器產生的各種事件、網絡處理、前端渲染等行為,js的事件循環機制,即EventLoop應運而生。

JavaScript是單線程的原因

js的設計初衷是作為瀏覽器的腳本語言,瀏覽器中涉及到與用戶互動、頻繁操作DOM等動作,如果js設計為多線程,會有很復雜的線程同步問題,即使同步問題被解決,也會降低瀏覽器的響應效率,得不償失,因此,JavaScript被設計為單線程保證瀏覽器動作的一致性。

事件循環(EventLoop)

JavaScript既然被設計為單線程,是如何做到異步的呢?這時就用到了JavaScript的事件循環機制。

如下圖所示為JavaScript事件循環的原理圖。

事件循環機制:JavaScript被設計為單線程,那如何做到異步的呢?

如圖所示,事件循環是主線程循環讀取任務隊列中的任務,直到所有的任務都被執行。在事件循環中,JavaScript用到了棧、堆以及隊列等數據結構。

  • 棧中存放的是執行上下文,有函數被調用時,就會創建上下文存放在執行棧中。
  • 堆中表示一個非結構化的內存區域,用來存放對象。隊列是指任務隊列,用于存放異步任務。
  • js引擎遇到一個異步事件之后不會一直等待事件的返回結果,而是將事件掛起,繼續執行執行棧中的其他任務。

當異步事件返回結果時,js將異步事件callback函數放入隊列中,被放入隊列中的異步事件不會立即回調,等到當前執行棧中的任務都執行完成,處于閑置狀態的主線程按照隊列順序將處于首位事件的callback函數放入執行棧中,執行該函數的同步代碼,如果遇到了異步事件,同樣也會將其回調函數放入事件隊列中......

如此反復,就形成了一個無限循環,這也是被稱為“事件循環(EventLoop)”的原因。

宏任務(Micro task)和微任務(Macro task)

js事件循環的基本原理已經描述清楚,但是異步任務之間也有所不同。

上面講到,JavaScript在執行異步任務時,回調函數會被放在js的任務隊列中,實際上,回調函數的類別不同,執行的優先級也不同。

不同的優先級被分為兩類,一類是宏任務(Micro task),一類是微任務(Macro task)。

回調函數是微任務時,會被放在微任務隊列,回調函數是宏任務時,會被放在宏任務隊列。微任務的優先級高于宏任務,當主線程的任務執行完成時,會首先去執行微任務隊列中首位的回調函數,當微任務隊列中為空時,才回去執行宏任務隊列中的回調函數。

常見的微任務有:promise,常見的宏任務有setInterval等。

因此,事件循環的執行流程圖如下所示:

? 事件循環機制:JavaScript被設計為單線程,那如何做到異步的呢? ?

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2021-01-10 11:21:33

JavaScript語言開發

2022-05-10 08:31:44

RedisQPS單線程

2016-09-06 21:23:25

JavaScriptnode異步

2017-03-06 14:08:38

JavaScript單線程setTimeout

2024-02-26 00:00:00

JavaScript單線程高效

2021-08-16 15:49:31

開發框架單線程異步

2025-04-24 08:15:00

Redis單線程線程

2020-09-28 14:41:24

Event Loop

2009-07-10 09:05:20

SwingWorker

2020-06-16 14:19:50

Javascript多線程編程

2011-06-22 09:45:46

JavaScriptAPI

2025-06-17 00:22:00

2021-10-15 09:56:10

JavaScript異步編程

2020-10-26 08:55:52

Redis單線程模型

2020-11-09 09:33:37

多線程

2010-08-30 08:55:56

JavaScript引

2022-01-04 11:11:32

Redis單線程Reactor

2019-12-06 10:59:20

JavaScript運行引擎

2010-01-28 16:45:44

Android單線程模

2018-05-13 21:57:04

JavaScript異步編程方案
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久网站 | 福利在线看 | 东京av男人的天堂 | 久久久久久99 | 欧美a在线 | 午夜在线| 免费的色网站 | 国产亚洲欧美在线视频 | 国产视频中文字幕 | 日韩精品免费一区 | 青青久视频 | 久久国产精品久久久久久久久久 | 草b视频 | www国产亚洲精品久久网站 | 日韩免费在线视频 | 日韩有码一区二区三区 | 中文字幕在线观看第一页 | 久久久久久久久久毛片 | 久久高清国产视频 | 一区二区三区视频在线免费观看 | 日韩精品一区二区三区在线观看 | av激情在线 | 欧美精品在线免费 | 日本不卡一区二区三区在线观看 | 日本久久久一区二区三区 | 国产色网站| av男人的天堂av | 99久久精品国产一区二区三区 | 毛片免费看 | 亚洲欧美综合 | 精品国产一区二区国模嫣然 | 国产亚洲精品美女久久久久久久久久 | 国产一区二区不卡 | 超碰在线免费 | 亚洲精品一区二区在线观看 | 高清视频一区二区三区 | 日本精品一区 | 国产精品久久精品 | 久久中文视频 | 欧美精品在欧美一区二区少妇 | 日韩aⅴ视频 |