几个概念:
- Call Stack(执行栈):所有同步任务都放在主线程上执行,形成一个执行栈
- Web APIs
- Event Loop/Task Queue(事件队列):即宏任务队列
- MacroTask(宏任务):Task Queue,存setTimeout,setInterval,I/O,UI rendering等
- MicroTask(微任务):process.nextTick, Promises(原生的), MutationObserver等。
-
Render Queue(渲染队列)
- 同步任务执行完;
- 去执行 microtasks ,把所有 microtasks queues 清空;
- 取出一个 macrotasks queues 的完成事件,在执行栈中执行,期间生成的所有 microTask 插入到微任务队列中;
- 再去执行 microtasks;
- …
- …
- …
setTimeout(function() {
console.log('timeout1');
})
new Promise(function(resolve) {
console.log('promise1');
for(var i = 0; i < 1000; i++) {
i == 99 && resolve();
}
console.log('promise2');
}).then(function() {
console.log('then1');
})
console.log('global1');
// promise1
// promise2
// global1
// then1
// timeout1