JavaScript宏任務(wù)和微任務(wù)區(qū)別介紹
分類
js中的任務(wù),大致分為2類,一類是同步任務(wù),另一類是異步任務(wù)。而異步任務(wù),又分為宏任務(wù)和微任務(wù),這兩個(gè)任務(wù)是兩個(gè)隊(duì)列,所以是先進(jìn)先出的。
同步任務(wù)指的是,在主線程上排隊(duì)執(zhí)行的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù)。
異步任務(wù)指的是,不進(jìn)入主線程、而進(jìn)入"任務(wù)隊(duì)列"的任務(wù),只有等主線程任務(wù)執(zhí)行完畢,"任務(wù)隊(duì)列"開(kāi)始通知主線程,請(qǐng)求執(zhí)行任務(wù),該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行
宏任務(wù)
主代碼塊、setTimeout、setInterval等
有些地方會(huì)列出來(lái)UI Rendering
,說(shuō)這個(gè)也是宏任務(wù),可是在讀了HTML規(guī)范文檔
以后,發(fā)現(xiàn)這很顯然是和微任務(wù)平行的一個(gè)操作步驟
requestAnimationFrame
姑且也算是宏任務(wù)吧,requestAnimationFrame
,下次頁(yè)面重繪前所執(zhí)行的操作,而重繪也是作為宏任務(wù)的一個(gè)步驟來(lái)存在的,且該步驟晚于微任務(wù)的執(zhí)行
宏任務(wù)是主流,當(dāng)js開(kāi)始被執(zhí)行的時(shí)候,就是開(kāi)啟一個(gè)宏任務(wù),在宏任務(wù)中執(zhí)行一條一條的指令
宏任務(wù)可以同時(shí)有多個(gè),但會(huì)按順序一個(gè)一個(gè)執(zhí)行;
每一個(gè)宏任務(wù),后面都可以跟一個(gè)微任務(wù)隊(duì)列,如果微任務(wù)隊(duì)列中有指令或方法,那么就會(huì)執(zhí)行;如果沒(méi)有,則開(kāi)始執(zhí)行下一個(gè)宏任務(wù),直到所有的宏任務(wù)執(zhí)行完為止。
微任務(wù)
Promise、async/await等
需要注意的是,promise里的then才會(huì)被加入微任務(wù),它的resolve是同步里的
async函數(shù)里遇到await之前的代碼是同步里的,遇到await時(shí),會(huì)執(zhí)行await后面的函數(shù),然后返回一個(gè)promise,把a(bǔ)wait下面的代碼放入微任務(wù),并且退出這個(gè)async函數(shù)。
為什么
為什么有了宏任務(wù),還會(huì)有微任務(wù)存在?
因?yàn)楹耆蝿?wù)太占用性能,當(dāng)需要一些較早就準(zhǔn)備好的方法,排在最后才執(zhí)行的時(shí)候,又不想新增一個(gè)宏任務(wù),那么就可以把這些方法,一個(gè)一個(gè)的放在微任務(wù)隊(duì)列里面,在這個(gè)宏任務(wù)中的代碼執(zhí)行完后,就會(huì)執(zhí)行微任務(wù)隊(duì)列。
案例
console.log('整體script開(kāi)始。'); setTimeout(()=>{ console.log('宏任務(wù)setTimeout的回調(diào)函數(shù)。') }) Promise.resolve().then(function() { console.log('微任務(wù)Promise回調(diào)函數(shù)1。') }).then(function() { console.log('微任務(wù)Promise回調(diào)函數(shù)2。') }) console.log('整體script結(jié)束。')
結(jié)果:
整體script開(kāi)始。
整體script結(jié)束。
微任務(wù)Promise回調(diào)函數(shù)1。
微任務(wù)Promise回調(diào)函數(shù)2。
宏任務(wù)setTimeout的回調(diào)函數(shù)。
到此這篇關(guān)于JavaScript宏任務(wù)和微任務(wù)區(qū)別介紹的文章就介紹到這了,更多相關(guān)JS宏任務(wù)與微任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談JavaScript宏任務(wù)和微任務(wù)執(zhí)行順序
- 淺談js中的宏任務(wù)和微任務(wù)
- JavaScript中的宏任務(wù)和微任務(wù)執(zhí)行順序
- JS事件循環(huán)機(jī)制event loop宏任務(wù)微任務(wù)原理解析
- JavaScript?微任務(wù)和宏任務(wù)講解
- 詳解JS事件循環(huán)及宏任務(wù)微任務(wù)的原理
- JavaScript事件循環(huán)及宏任務(wù)微任務(wù)原理解析
- 淺談javascript事件環(huán)微任務(wù)和宏任務(wù)隊(duì)列原理
- JavaScript中的宏任務(wù)和微任務(wù)詳情
- JavaScript的宏任務(wù)和微任務(wù)有哪些以及怎樣執(zhí)行的詳解
相關(guān)文章
Bootstrap免費(fèi)字體和圖標(biāo)網(wǎng)站(值得收藏)
在這篇內(nèi)容中,我們把這套框架上的免費(fèi)字體圖標(biāo)做了個(gè)整合(當(dāng)然,以后還會(huì)不斷的更新)。大家對(duì)bootstrap免費(fèi)字體圖標(biāo)有需要的話,可以參考本教程2017-03-03javascript算法學(xué)習(xí)(直接插入排序)
假設(shè)待排序的記錄存放在數(shù)組R[1..n]中。初始時(shí),R[1]自成1個(gè)有序區(qū),無(wú)序區(qū)為R[2..n]。從i=2起直至i=n為止,依次將R[i]插入當(dāng)前的有序區(qū)R[1..i-1]中,生成含n個(gè)記錄的有序區(qū)。2011-04-04JavaScript通過(guò)join函數(shù)連接數(shù)組里所有元素的方法
這篇文章主要介紹了JavaScript通過(guò)join函數(shù)連接數(shù)組里所有元素的方法,實(shí)例分析了javascript中join函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03JS彈出對(duì)話框?qū)崿F(xiàn)方法(三種方式)
這篇文章主要介紹了JS彈出對(duì)話框?qū)崿F(xiàn)方法,結(jié)合實(shí)例形式分析了三種方式,包括alert、confirm及prompt,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12javascritp添加url參數(shù)將參數(shù)加入到url中
javascritp添加url參數(shù)方法,將參數(shù)加入到url中,如果原來(lái)url中有則覆蓋,下面是示例代碼,感興趣的朋友可以參考下2014-09-09前端JavaScript實(shí)現(xiàn)文件壓縮的全面優(yōu)化指南
JavaScript文件大小直接影響網(wǎng)頁(yè)加載速度和用戶體驗(yàn),本文將詳細(xì)介紹從基礎(chǔ)到高級(jí)的各種JavaScript壓縮優(yōu)化技術(shù),小伙伴可以根據(jù)需求進(jìn)行選擇2025-04-04javascript實(shí)現(xiàn)div浮動(dòng)在網(wǎng)頁(yè)最頂上并帶關(guān)閉按鈕效果實(shí)例
我們有時(shí)會(huì)看到有些網(wǎng)站最頂部一直會(huì)跟著我們滾動(dòng)而滾動(dòng)了,這種方法其實(shí)很簡(jiǎn)單,下面我來(lái)給大推薦一個(gè)javascript實(shí)現(xiàn)div浮動(dòng)在網(wǎng)頁(yè)最頂上并帶關(guān)閉按鈕效果2013-08-08