https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2017/11/21/15fdd88994142347~tplv-t2oaga2asx-watermark.awebp

js任务分为同步任务,异步任务。当两种任务一同进入执行栈时,两种任务会进入不同的环境,同步任务会进入主线程,异步任务会进入Event Table并注册回调函数,当异步任务有返回结果时,js会把当前的异步任务放入事件队列。等主线程执行完同步任务闲置后,会去事件队列查找是否有异步任务,如果有就会将排在第一位的任务放入主线程执行,然后异步又注册回调,主线程继续执行同步代码,然后又会开始检索事件队列,由此形成一个循环,就是事件循环

异步任务

异步任务分为宏任务(macro task)微任务(micro task)

宏任务

宏任务优先级低于微任务,宏任务会等待微任务队列清空后才会执行,宏任务主要有

  1. setTimeout
  2. setInterval
  3. postMessage
  4. UI交互
  5. I/O
  6. setImmediate

微任务

微任务优先级高,会先与宏任务执行。主要有

  1. Promise.then
  2. MutationObserver
  3. await 下面的代码
  4. process.nextTick

node环境下的事件循环

┌───────────────────────┐
┌─>│        timers         │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     I/O callbacks     │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     idle, prepare     │
│  └──────────┬────────────┘      ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:   │
│  │         poll          │<──connections───     │
│  └──────────┬────────────┘      │   data, etc.  │
│  ┌──────────┴────────────┐      └───────────────┘
│  │        check          │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
└──┤    close callbacks    │
   └───────────────────────┘