js执行为单线程(不考虑web worker),所有代码皆在主线程调用栈完成执行。当主线程任务清空后才会去轮询取任务队列中任务。
任务队列
异步任务分为task(宏任务,也可称为macroTask)和microtask(微任务)两类。 当满足执行条件时,task和microtask会被放入各自的队列中等待放入主线程执行,我们把这两个队列称为Task Queue(也叫Macrotask Queue)和Microtask Queue。
姑且把宏任务叫做主任务
- 主任务:script中代码、setTimeout、setInterval、I/O、UI render。
- 微任务: promise、Object.observe、MutationObserver。
具体过程
- 执行完主执行线程中的任务。
- 取出Microtask Queue中任务执行直到清空。
- 取出Macrotask Queue中一个任务执行。
- 取出Microtask Queue中任务执行直到清空。
- 重复3和4。
同步完成后,一个宏任务,所有微任务,一个宏任务,所有微任务......