背景
當(dāng)我們忙于公司業(yè)務(wù)開發(fā),習(xí)慣于control+c、control+v這種機(jī)械化操作時(shí),我們將會(huì)離我們的理想越來越遠(yuǎn)。你可能會(huì)忘記或者疏于最基本,最底層的原理。在此,我們將一起踏上回頭路,去探望我們遺失的美好。
之前在網(wǎng)上看了很多關(guān)于setTimeout,setinterval,promise等的文章,都能起到延遲執(zhí)行的效果。但具體怎么執(zhí)行,順序怎樣,講解的都很片面,最近正好也被人問道,所以總結(jié)了一下以供大家參考。寫的不好請(qǐng)留言多多指教,謝謝。
說起setTimeout,setinterval,promise等能夠?qū)崿F(xiàn)異步執(zhí)行,我們必須先了解下JS的
事件循環(huán)
Event Loop,不管是前端、還是移動(dòng)端(IOS和Android)等開發(fā),都離不開事件循環(huán)機(jī)制,他會(huì)循環(huán)監(jiān)聽任務(wù),并在適當(dāng)?shù)臅r(shí)機(jī)取出、執(zhí)行和釋放任務(wù),更新UI等操作,更新UI渲染界面比較耗時(shí),不同的渲染引擎有自己的一套渲染時(shí)機(jī)邏輯,決定要不要馬上執(zhí)行更新,畢竟更新UI成本大。
任務(wù)隊(duì)列
宏任務(wù):script(全局任務(wù)), setTimeout, setInterval, setImmediate, I/O, UI rendering.
微任務(wù):process.nextTick, Promise.then, Object.observer, MutationObserver.
閉包
說起閉包,最明顯的特點(diǎn)有三個(gè),
1、函數(shù)套函數(shù)。
2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量。
3、局部變量,垃圾回收機(jī)制無法收回。
? ?通過示例來查看執(zhí)行順序


輸出結(jié)果
總結(jié)
????1、js中為了防止線程阻塞,阻止全局代碼的執(zhí)行,衍生出很多異步執(zhí)行解決方案,這些方案都會(huì)按需加載到指定的隊(duì)列中,當(dāng)全局隊(duì)列執(zhí)行完畢后,開始循環(huán)從 微隊(duì)列->宏隊(duì)列->微隊(duì)列->宏隊(duì)列...這種執(zhí)行順序執(zhí)行下去。
????2、當(dāng)一個(gè)宏觀隊(duì)列執(zhí)行完畢,立刻執(zhí)行最近添加的微觀隊(duì)列。
????3、這種邏輯也可以為首頁加速帶來思路。
在使用中有任何問題,歡迎留言反饋給我。書寫不易,希望大家可以喜歡。