先说几个概念
- JS是单线程
- JS运行环境:浏览器或Node
- 执行栈,遵循先进后出的原则。当开始执行JS代码时,首先会执行一个main函数,然后执行我们的代码。
- event loop中,每次循环成为tick,每一次tick任务如下
- 执行栈选择最先进入队列的宏任务,执行同步代码直到结束
- 检查是否存在微任务,有则执行至微任务队列为空
- 如果宿主为浏览器,开始渲染页面
- 开始下一轮tick,执行宏任务中的异步代码(setTimeout等回调)
| - | 宏任务(macrotask)jobs | 微任务(microtask) task |
|---|
| 发起方 | 宿主 | JS引擎 |
| 具体事件 | 1. script 2. setTimeout/setInterval 3. UI redering/UI事件 4. postMessage/MessageChannel 5. setImmediate,I/O | 1. Promise 2. MutaionObserver |
| 谁先运行 | 后 | 先 |
| 会触发新一轮tick吗 | 会 | 不会 |
想想他的输出顺序吧~
console.log('start')
setTimeout(() => {
console.log('setTimeout');
}, 0);
new Promise((resolve) => {
console.log('promise');
resolve();
}).then(() => {
console.log('then1');
}).then(() => {
console.log('then2');
});
console.log('end');