Microtask與Macrotask,異步執(zhí)行順序的差異
要明白這個(gè)問題需要去了解js的事件循環(huán)模型袱贮。了解過程中會明白js的執(zhí)行棧仿便,作用域鏈,變量提升攒巍,js的單線程原因等許多問題探越。
關(guān)鍵詞:marcotask microtask queue 執(zhí)行上下文context 堆heap 棧stack 作用域
寫的很簡單,主要是思路窑业,細(xì)節(jié)google就可以钦幔。
參考
引入
一個(gè)代碼執(zhí)行順序的例子:
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('script end');
//script start
//script end
//promise1
//promise2
//undefined
//setTimeout
這里順序的判斷就涉及到了宏任務(wù)鲤氢,微任務(wù)。
event loop
JS是單線程的語言西潘,同步執(zhí)行代碼會造成阻塞卷玉,異步解決了這一問題。但是異步是如何實(shí)現(xiàn)的喷市?
事件循環(huán)模型相种,event loop實(shí)現(xiàn)異步。
而在瀏覽器環(huán)境與NodeJs環(huán)境又有差異品姓,NodeJs里的event loop更復(fù)雜一些寝并,這里主要說明瀏覽器環(huán)境中的event loop,但是具體到不同瀏覽器上代碼的執(zhí)行順序也有差異腹备。
- 總體上來講衬潦,setTimeout,setTimeInterval粒度更大植酥,屬于宏任務(wù)镀岛,promise.then中的回調(diào)粒度小弦牡,是微任務(wù)。
- setTimeout漂羊,在0ms后將callback加入到宏任務(wù)的queue中驾锰,而promise的回調(diào)放在微任務(wù)的queue中
- 當(dāng)前JS線程中的任務(wù)執(zhí)行完成后(正常代碼都會放入執(zhí)行棧中,執(zhí)行棧中空閑后)走越,queue中的函數(shù)會按隊(duì)列執(zhí)行稻据。先去微任務(wù)的queue,再去執(zhí)行宏任務(wù)隊(duì)列中的callback买喧。