- 宏任务:script(可理解为外层同步代码),定时器,用户交互事件等等
- 微任务:Promise,MutationObserver等
执行原则
- 先执行同步代码,后执行异步代码
- 同一层级,先执行微任务,后执行宏任务,即Promise.then 比setTimeout先
- 每个宏任务,都单独关联了一个微任务队列
console.log('start')
setTimeout(()=>{
console.log("1-setTimeout");
new Promise((resolve)=>{
console.log('1-promise')
resolve()
}).then(()=>{
console.log("1-promise-then");
}).then(()=>{
console.log('1-promise-then2')
})
});
new Promise((resolve)=>{
console.log('2-promise')
resolve()
}).then(()=>{
console.log("2-promise-then");
setTimeout(()=>{
console.log("2-setTimeout");
});
});
console.log('end')
分辨层级
setTimeout(()=>{
Promise.resolve().then(
console.log('此处属于 外部 setTimeout的微任务队列')
)
setTimeout(()=>{
Promise.resolve().then(
console.log('此处属于 内部 setTimeout的微任务队列')
)
})
})