首先JS是單線程的链沼,也就意味著同一時(shí)間內(nèi)只能做一件事秦忿,但是這并不意味單線程就是阻塞麦射,而實(shí)現(xiàn)單線程非阻塞的方法就是事件循環(huán)
JS所有任務(wù)中又分為同步任務(wù)跟異步任務(wù):
①同步任務(wù):立即執(zhí)行的任務(wù),同步任務(wù)一般會(huì)直接進(jìn)入到主線程中執(zhí)行
②異步任務(wù):異步任務(wù)的執(zhí)行灯谣,比如Ajax網(wǎng)絡(luò)請(qǐng)求潜秋,setTimeout定時(shí)器等等
同步任務(wù)與異步任務(wù)的運(yùn)行流程圖如下:
JS它會(huì)先執(zhí)行同步任務(wù),然后執(zhí)行異步任務(wù)胎许,異步任務(wù)又分為宏任務(wù)跟微任務(wù)峻呛,遇到異步微任務(wù)則將微任務(wù)放入微任務(wù)隊(duì)列中,遇到宏任務(wù)則將宏任務(wù)放在宏任務(wù)隊(duì)列中辜窑,同步任務(wù)執(zhí)行完畢之后再去異步任務(wù)中先執(zhí)行微任務(wù)后執(zhí)行宏任務(wù)钩述,一直循環(huán)至所有任務(wù)執(zhí)行完畢
宏任務(wù)跟微任務(wù)的關(guān)系如圖所示:
常見(jiàn)的微任務(wù)有:promise.then(),Node.js-nextTick
常見(jiàn)的宏任務(wù)有:定時(shí)器谬擦,Ajax切距,事件函數(shù)