浏览器事件环
-
注意代码执行顺序:栈中代码 => 微任务队列(清空) => 宏任务队列
-
计算机调度任务的最小单位是进程,js他是单线程并且有一个主线程
-
渲染线程和js线程是互斥的
-
当前主栈全部执行完毕后 清空微任务 ,会取出一个宏任务 -> 执行完毕后 继续清空微任务 -> 无线循环
-
微任务: promise.then ,MutationObserver,
-
宏任务:script ,ajax , 事件,requestFrameAnimation, setTimeout ,setInterval ,setImmediate (ie下),MessageChannel ,UI rendering
setTimeout(()=>{
console.log('time1')
Promise.resolve().then(()=>{
console.log('then 3');
})
Promise.resolve().then(()=>{
console.log('then 4');
})
},0)
setTimeout(() => {
console.log('time2');
},0);
Promise.resolve().then(()=>{
console.log('then 1');
})
Promise.resolve().then(()=>{
console.log('then 2');
})
Node事件环 (浏览器的事件环 node 11 版本 表现和浏览器一致)
- timer 阶段 (定时器的回调)
- poll 阶段 (io的回调)等定时器到达后 执行对应的回调
- check 阶段 检查setImmediate
- 当阶段切换时 会执行微任务 把微任务清空