js運行機制-事件循環EventLoop
先來看看一段js代碼:
console.log("script begin") setTimeout(() => { console.log("setTimeout") },0) new Promise((resolve) => { console.log("promise begin") for(let i = 0; i < 1000; i++) { i == 999 && resolve() } }).then(() => { console.log("promise then") }) console.log("script end")
在node命令行里執行這段js代碼,輸出的情況為script begin-promise begin——script end——promise then——setTimeout,為什么會這樣呢?我們先來了解幾個概念.
js單線程如何理解js單線程意思就是同一時間只能做一件事,按照先后順序執行.那么,為什么JavaScript不能有多個線程呢?這樣能提高效率啊.
JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操作DOM。這決定了它只能是單線程,否則會帶來很復雜的同步問題。比如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?
所以,為了避免復雜性,從一誕生,JavaScript就是單線程。
主線程和任務隊列單線程就意味著,所有任務需要排隊。所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。
同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;
異步任務:不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務可以執行了,該任務才會進入主線程執行。
下圖是主線程和任務隊列的示意圖:
宏任務和微任務了解完主線程,還要了解一下任務,任務有宏任務(MacroTask)和微任務(MicroTask)之分。
宏任務主要有:script代碼段、setTimeout、setInterval、Promise的構造函數、setImmediate、I/O等.
微任務主要有:process.nextTick和Promise的回調這兩種情況.
如果宏任務在本輪Event Loop中執行,則微任務在本輪Event Loop的所有宏任務結束后執行(Event Loop下面會講到)。下面為宏任務和微任務的執行示意圖:
Event Loop主線程從"任務隊列"中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為Event Loop(事件循環)
我們再回頭看看開始的一段代碼:
首先任務進入執行棧,除了setTimeout,其他的進入主線程執行,setTimeout則進入任務隊列;
然后主線程里面的任務又有宏任務和微任務,先執行宏任務,微任務在所有宏任務結束后執行;
所以先輸出script begin-promise begin——script end——promise then;
最后主線程讀任務隊列的異步任務,最后輸出setTimeout
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109051.html
摘要:宏任務主要有整體代碼交互事件環境。按照中的定義告訴瀏覽器你希望執行一個動畫,并且要求瀏覽器在下次重繪之前調用指定的回調函數更新動畫??偨Y我們要記住最重要的兩點是單線程和的循環機制。 showImg(https://segmentfault.com/img/bVbsEQs?w=900&h=540); 我們知道 js 是單線程執行的,那么異步的代碼 js 是怎么處理的呢?例如下面的代碼是如...
摘要:引言學習的時候,經常聽人說,即是異步的,又是單線程的。所以我們說是異步單線程的。參考從瀏覽器多進程到單線程,運行機制最全面的一次梳理運行機制詳解再談異步機制詳解運行原理解析并發模型與事件循環 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 學習javascipt的時候,經常聽人說,javascipt即是異步...
摘要:前沿是基于引擎的運行環境具有事件驅動非阻塞等特點結合具有網絡編程文件系統等服務端的功能用庫進行異步事件處理線程的單線程含義實際上說的是執行同步代碼的主線程一個程序的啟動不止是分配了一個線程,而是我們只能在一個線程執行代碼當出現資源調用連接等 前沿 Node.js 是基于V8引擎的javascript運行環境. Node.js具有事件驅動, 非阻塞I/O等特點. 結合Node API, ...
摘要:異步任務必須指定回調函數,當異步任務從任務隊列回到執行棧,回調函數就會執行。事件循環主線程從任務隊列中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為。事件循環事件循環是指主線程重復從消息隊列中取消息執行的過程。 參考鏈接:這一次,徹底弄懂 JavaScript 執行機制https://zhuanlan.zhihu.com/p/...從瀏覽器多進程到JS單線程,JS運行機制...
摘要:同時,如果執行的過程中發現其他函數,繼續入棧然后執行。上面我們討論的其實都是同步代碼,代碼在運行的時候只用調用棧解釋就可以了。 序 Event Loop 這個概念相信大家或多或少都了解過,但是有一次被一個小伙伴問到它具體的原理的時候,感覺自己只知道個大概印象,于是計劃著寫一篇文章,用輸出倒逼輸入,讓自己重新學習這個概念,同時也能幫助更多的人理解它~ 概念 JavaScript 是一門 ...
閱讀 3242·2021-10-27 14:20
閱讀 2524·2021-10-08 10:05
閱讀 1624·2021-09-09 09:33
閱讀 2901·2019-08-30 13:16
閱讀 1434·2019-08-29 18:34
閱讀 1169·2019-08-29 10:58
閱讀 1228·2019-08-28 18:22
閱讀 1226·2019-08-26 13:33