宏任务
script(整体代码)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)
微任务
Promise.then
Object.observe
MutationObserver
process.nextTick(Node.js 环境)
----------------------------------------------------------------来猜猜代码执行顺序呀
--------输出结果
我画了一个简陋的图
我来描述下,执行顺序,同步代码肯定先执行的,是直接进入执行栈的,所以第一个输出”我是同步代码“,在每个任务单元下,包括同步、异步,执行完成后,都会检测这个作用域下目前的单元任务中也没有没有执行的微任务,有就会执行,没有就会执行下一个任务单元。所以当同步码执行完后就会发现有个微任务,所以第二个就输入”我是微任务“,就到了两个宏任务了,因为写的setTimeout时间都是一样的,所以就看前后顺序了,是第一个setTimeout宏任务执行先,这个任务单元下,肯定就是同步任务代码先执行,所以就输出了”我是宏任务1“,然后就看也没有微任务,发现有微任务就执行了”我是第一个宏任务中的微任务“,然后就在队列后注册了一个setTimeout宏任务,但不会先执行,因为第二个宏任务比他先注册,而且时间是一样。然后就到了第二个宏任务,一样先执行了同步代码,输出了”我是宏任务2“,然后又往队列后注册了一个setTimeout宏任务,然后就到了宏任务1注册的宏任务,输出”我是第一个宏任务里面的第一个宏任务“,然后执行第二个宏任务注册的宏任务,就输出”我是第二个宏任务里面的第一个宏任务“。
因为我们这里用的setTimeout都是一样的时间,所以输出是这样,但如果setTimeout写了时间,答案又会不一样的。
如果我这样写,输出就是2 1
因为,两个会放在工作线程里,当下面的setTimeout到了500毫秒,他就会放进任务队列,
当,而上面的setTimeout还没到1000毫秒,就要等,当函数执行栈空了,任务队列第一个就会进去执行,就输出2。上面的setTimeout到1000毫秒就进入了任务队列,然后就输出了1.所以并不是先看谁先注册,我们发现任务队列并不是⼀下⼦就会将任务2和任务三⼀起放进去,⽽是哪个计时器到时间了哪个放进去。
谢谢