# 事件机制

js中有同步事件和异步事件,异步事件分为宏任务(setTimeout,ajax,setInterval, I/O,UI交互事件)和微任务(process.nextTick,Promise)

  • js运行时会生成执行栈
  • 执行栈中的任务会从上到下执行
  • 执行栈中任务清空后,检测微任务队列中是否有任务
    • 有任务则执行到微任务列表清空
  • 再去检测事件队列中是否有宏任务
    • 有任务则取出一个宏任务执行
  • 再去检测微任务队列中是否有任务
    • 有任务则执行到微任务列表清空
  • 再去检测事件队列中是否有宏任务
    • 有任务则取出一个宏任务执行
  • 重复执行以上操作,知道异步任务都执行完返回执行栈继续执行

# 注意点

  • 递归调用setTimeout(() =>{}, 0), 不会阻塞主线程
  • 递归调用Promise.then, 会阻塞主线程,页面卡死