简单来说js的执行顺序为以下:
执行顺序
同步程序
process.nextTick
微任务
宏任务
setlmmediate
宏任务可以简单的认为有这几类:延时器(settimeout),ajax,读取文件
任务队列中:Promise.then > MutationObserver > setImmediate > setTimeout
微任务:promise.then中的代码
此时延时器需要注意
任务在执行时会先执行运行栈中的代码,之后再执行任务队列中的代码如图:
当延时器有了延时,它不会立刻放入任务队列中,而是在任务循环中等待延时结束之后,再将它插入到任务队列中,若插入前任务队列中有其他任务,先执行其他任务最后才执行这个延时器任务
下面上一道面试题
setImmediate(() => {
console.log(9)
})
setTimeout(() => {
console.log(3)
}, 0)
setTimeout(() => {
console.log(4)
}, 100)
console.log(5)
new Promise((resolve) => {
console.log(6)
resolve()
}).then(() => {
console.log(7)
})
process.nextTick(() => {
console.log(8)
})
console.log(1)
setTimeout(() => {
console.log(2)
}, 0)
setTimeout(() => {
console.log(10)
}, 0)
console.log(11)
输出为:5, 6, 1,11,8, 7, 3, 2, 10, 9, 4
这里有个小坑,要注意延时器有没有延时,若是出现延时则需要等待其他任务执行之后才去执行