摘要:事件循環(huán)了解知識點線程執(zhí)行棧線程是單線程的語言可以單線程將理解為只有一條車道在車道里后面的車在等前面的車通過后才能通過即當(dāng)前面的程序沒有執(zhí)行后面的程序也不能執(zhí)行執(zhí)行棧執(zhí)行棧像車道被執(zhí)行的程序會放入執(zhí)行棧里但它的執(zhí)行的順序是后面進來的程序先執(zhí)
事件循環(huán) 了解知識點
線程
執(zhí)行棧
task queue
web api
macro task
micro task
線程javascript是單線程的語言,
可以單線程將理解為只有一條車道,在車道里后面的車在等前面的車通過后,才能通過.
即當(dāng)前面的程序沒有執(zhí)行,后面的程序也不能執(zhí)行.
執(zhí)行棧像"車道",被執(zhí)行的程序會放入執(zhí)行棧里,
但它的執(zhí)行的順序是,后面進來的程序先執(zhí)行.
視頻源地址
task queue在線程中有很多等待運行的任務(wù)(程序,而執(zhí)行棧只會放入一個任務(wù).
其他可運行任務(wù)會放入任務(wù)隊列中.
這里雖說是個隊列, 它的執(zhí)行的順序,不會先進的程序先執(zhí)行.
每個event loop都會有一個或多個任務(wù)隊列
javascript是單線程,但也能實現(xiàn)異步,這種實現(xiàn)基與頁面提供很多API,如(setTimeout, ajax, addEventListener ...)
這些都是異步函數(shù),也就是說,運行到異步函數(shù)時,
把異步函數(shù)里閉包放入web api里,等待正確的時機,
web api會把閉包放入task queue里執(zhí)行.
macro task有setTimeout ,setInterval, setImmediate,requestAnimationFrame,I/O ,UI渲染...
task queue 是由很多個macro task組成的隊列,
micro task有Promise, process.nextTick, Object.observe, MutationObserver...
每個event loop都會有一個micro task
執(zhí)行流程
當(dāng)執(zhí)行棧為null時
看task queue的第一個macro task是不是null,如果不是取出放入執(zhí)行棧,如果是跳轉(zhuǎn)5
執(zhí)行棧運行task
運行完畢,把task設(shè)置null,并移出
執(zhí)行 micro task隊列
a. 看micro task隊列第一task個是不是null,如果不是取出放入執(zhí)行棧,如果是跳轉(zhuǎn)f
b. 執(zhí)行棧運行task
c. 運行完畢,把task設(shè)置null,并移出
d. 看micro task隊列下一個task是不是null,如果不是跳轉(zhuǎn)b
f. 結(jié)束micro task隊列執(zhí)行
跳轉(zhuǎn)到1
示例 實戰(zhàn)猜想
在macro/micro task 進入執(zhí)行棧時,中間應(yīng)該會有一個緩存區(qū),
例如
如果是把整個macro task放入執(zhí)行棧,
按后進程序先執(zhí)行的機制, 應(yīng)該會先打印"b",
但打印的是"a",說明函數(shù)b是等函數(shù)a執(zhí)行完后再進入執(zhí)行棧的,
所以在macro task 會把里面的函數(shù)拆分為一個執(zhí)行的隊列,放入執(zhí)行棧里.
https://github.com/ccforward/cc/issues/48
https://juejin.im/entry/596d78ee6fb9a06bb752475c
作者有一年半的前端開發(fā)經(jīng)驗,比較擅長性能優(yōu)化和vue,喜歡對各種原理的深究,
喜歡籃球和電影
如果有趣味相投可以加入微信群
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/96514.html
摘要:準備工作假設(shè)源代碼目錄為編譯時啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機入口中設(shè)斷點,然后在的方法中設(shè)置斷點通過宏獲取當(dāng)前,然后創(chuàng)建第個棧幀,然后進入解釋執(zhí)行字節(jié)碼 準備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...
摘要:是否覆蓋目標(biāo)文件名是否緩沖默認緩沖區(qū)大小既然緩沖了,那意味著父類中的刷新控制為不進行同步刷新利用父類中的字節(jié)流字符流轉(zhuǎn)換方法實例化父類中的實際在上面指向了文件輸出流繼承,將文件進行日常轉(zhuǎn)存。 瞎扯 Log4j對Java開發(fā)者來說是經(jīng)常使用到的日志框架,我每次使用都對它的配置文件頭大,網(wǎng)上搜一個別人的例子自己改巴改巴,草草了事。再次使用時,又忘了怎么回事了。這次突然來了興趣,想看看它具體...
摘要:前言的基本概念組件的構(gòu)建方法以及高級用法這背后的一切如何運轉(zhuǎn)深入內(nèi)部的實現(xiàn)機制和原理初探源碼代碼組織結(jié)構(gòu)包含一系列的工具方法插件包含一系列同構(gòu)方法包含一些公用或常用方法如等包含一些測試方法等包含一些邊界錯誤的測試用例是代碼的核心部分它包含了 前言 React的基本概念,API,組件的構(gòu)建方法以及高級用法,這背后的一切如何運轉(zhuǎn),深入Virtual DOM內(nèi)部的實現(xiàn)機制和原理. 初探Rea...
摘要:的單線程,與它的用途有關(guān)。特點的顯著特點異步機制事件驅(qū)動。隊列的讀取輪詢線程,事件的消費者,的主角。它將不同的任務(wù)分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 這兩天跟同事同事討論遇到的一個問題,js中的event loop,引出了chrome與node中運行具有setTimeout和Promise的程序時候執(zhí)行結(jié)果不一樣的問題,從而引出了Nodejs的...
摘要:一直感覺的特性挺神奇,所以這里初步探究下,這個模塊首先地址,,當(dāng)前版本為,為了配合吧,肯定也做了些更新,不過這個是個非官方的庫。 一直感覺hot module replacement的特性挺神奇,所以這里初步探究下webpack-hot-middleware,這個模塊 首先地址,https://github.com/glenjamin/...,當(dāng)前版本為2.13.2,為了配合webpa...
閱讀 4163·2021-07-28 18:10
閱讀 2766·2019-08-30 15:44
閱讀 1328·2019-08-30 14:07
閱讀 3650·2019-08-29 17:20
閱讀 1739·2019-08-26 18:35
閱讀 3742·2019-08-26 13:42
閱讀 1956·2019-08-26 11:58
閱讀 1752·2019-08-23 18:33