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