-
首先要對(duì)js執(zhí)行順序有一個(gè)了解脆贵。
js執(zhí)行代碼的過程是順序執(zhí)行,也就是從上往下執(zhí)行起暮,也就是說卖氨,當(dāng)執(zhí)行代碼時(shí),第一個(gè)任務(wù)先執(zhí)行完负懦,才會(huì)執(zhí)行下一個(gè)任務(wù)筒捺,但是如果中途有任務(wù)執(zhí)行耗時(shí)太長,又不能讓后面任務(wù)等待纸厉,這個(gè)時(shí)候就需要分成倆個(gè)任務(wù)了系吭,
同步任務(wù)
和異步任務(wù)
,等同步任務(wù)也就是主線程任務(wù)執(zhí)行完成,會(huì)到異步隊(duì)列里面拿取任務(wù)残腌。
1.js是單線程語言
2.JavaScript執(zhí)行機(jī)制是Event Loop
-
異步任務(wù)分為
宏任務(wù)
和微任務(wù)
1.首先我們進(jìn)入異步隊(duì)列中會(huì)先檢測微任務(wù)中是否有可執(zhí)行的代碼
2.如果有任務(wù)存在村斟,則執(zhí)行完所以的微任務(wù)
3.沒有微任務(wù)存在贫导,則重新執(zhí)行宏任務(wù)抛猫,往此反復(fù)
同步任務(wù),異步任務(wù)圖解
宏任務(wù)微任務(wù)執(zhí)行圖解
宏任務(wù)微任務(wù)執(zhí)行過程
所以從上面的圖我們可以得知:
1.同步任務(wù)先執(zhí)行孩灯,但是這里同步任務(wù)其實(shí)也是宏任務(wù)9虢稹!峰档!
2.異步隊(duì)列是先判斷是否有可執(zhí)行的微任務(wù)
我們用個(gè)例子說明一下:
console.log('start');
setTimeout(() => {
console.log('setTimeout');
setTimeout(() => {
console.log('2222');
},0)
Promise.resolve().then(function() {
console.log('promise3');
}).then(function() {
console.log('promise4');
});
new Promise((resolve,reject) => {
console.log(1111);
})
},0)
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('end');
//答案如下
start
end
promise1
promise2
setTimeout
1111
promise3
promise4
2222
執(zhí)行過程:
1.先執(zhí)行同步任務(wù)败匹,所以先輸出start,end讥巡,因?yàn)閏onsole.log是同步任務(wù)掀亩,其實(shí)也是宏任務(wù),直接執(zhí)行欢顷。
2.然后執(zhí)行Promise.then方法槽棍,是異步隊(duì)列里面的微任務(wù),輸出promise1抬驴,promise2.
3.最后執(zhí)行存入異步隊(duì)列里面的setTimeout方法炼七。但是在這里面也分為宏任務(wù),微任務(wù)布持,先執(zhí)行console豌拙,輸出setTimeout题暖。
4.這里特別注意按傅,new實(shí)例化的promise和Promise之間不一樣捉超,new promise是宏任務(wù),先執(zhí)行唯绍,在執(zhí)行微任務(wù)Promise狂秦,最后執(zhí)行setTimeout。
對(duì)于宏任務(wù)推捐,和微任務(wù)理解后期會(huì)做更新裂问!