Structure-study-eventLoop

279 阅读1分钟

浏览器事件环

  • 注意代码执行顺序:栈中代码 => 微任务队列(清空) => 宏任务队列

  • 计算机调度任务的最小单位是进程,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
  • 当阶段切换时 会执行微任务 把微任务清空