js代码执行顺序:一个宏任务->多个微任务->一个宏任务->多个微任务,如此循环,就叫事件循环event loop
js一次只能执行一个宏任务,一次可以执行多个微任务
1.两个定时器中的回调函数都是宏任务
2.promise中的resolve和reject都是是微任务
3主线程的执行栈中的所有同步任务可以看作是一个宏任务
console.log(0)
setTimeout(() => {
console.log(1)
}, 0)
new Promise((resolve) => {
console.log(2)
resolve()
console.log(3)
}).then(() => {
console.log(4)
})
console.log(5)
结果为
0
2
3
5
4
1
首先,js优先执行主线程中的同步任务(看作一个宏任务),从上往下依次执行打印0,然后遇见定时器,把它的回调函数(异步任务)扔到任务队列中等待,接着执行promise对象打印2,3,把resolve()这个回调函数(异步任务)也扔到任务队列中等待,接着打印5,同步任务此时就全部执行完毕了(一个宏任务执行完毕,接下来开始执行微任务),系统自动读取任务队列中的回调函数到主线程的执行栈中继续执行,上面说了,promise中的回调函数为微任务,定时器中的回调函数为宏任务,此时该执行微任务,也就是执行resolve()调用then了,然后打印出4,此时js已经完成一个宏任务,多个微任务的流程操作(我这里只写了一个promise,如果有多个微任务,在此时也会同时执行),接下来js就会再循环执行一个宏任务了,此时定时器的回调函数就属于宏任务,js执行打印1!