j执行顺序
https://zhuanlan.zhihu.com/p/30894022
事件循环分为同步任务,异步任务,,同步任务顺序执行,异步任务中分为宏任务和微任务;
宏任务在下一轮事件循环中执行,微任务在本轮事件循环结束前、在本轮事件循环所有task结束后执行的任务。
刚才我介绍过事件循环机制,我们知道,当一个任务执行完后,主线程会从macro-task队列(之前说的消息队列)中取出事件,开始下一轮的任务执行。而某些情况下,我们需要某些任务要在本轮事件循环结束前执行,于是,除了macro-task队列外,其实还有一个micro-task队列,里面存放本轮正常任务执行中添加的需要在本轮事件循环结束前、在本轮事件循环所有task结束后执行的任务。
我们要区分任务执行的顺序,一定要搞清楚它是什么类型的任务。setTimeout上文已经讨论得很清楚了,它的回调函数是一个macro-task,会被放到macro-task队列。而对于Promise,被构造时传入的回调函数,是会立即执行的,它是task,会出现在调用栈中。而Promise实例的then方法中的回调函数是micro-task,会在该Promise实例的状态改变时(resolve)被放进micro-task队列。
- 碰到macro-task就将其交给处理它的模块处理完之后将回调函数放进macro-task的队列之中
- 碰到micro-task也是将其回调函数放进micro-task的队列之中
- 直到函数调用栈清空只剩全局执行上下文,然后开始执行所有的micro-task,在执行micro-task时如果再碰到micro-task,会将该micro-task继续添加到micro-task队列,当所有可执行的micro-task执行完毕之后,执行栈结束并返回(return)
- 循环再次执行macro-task队列中的一个任务,执行完之后再执行所有的micro-task,就这样一直循环
![]()


浙公网安备 33010602011771号