浅记【事件循环机制--宏任务--微任务】

164 阅读2分钟

浏览器中的事件循环

事件循环机制

简单来说:进程开始了之后,程序中会有一个任务队列,js程序按顺序地一个个任务执行。但为了避免阻塞,出现了异步任务。遇到异步任务之后,程序不会立即执行。而是把他放到异步任务的队伍中,等同步任务执行完之后再执行异步任务(当异步任务可以执行了,就会被放在同步任务队列中执行)。

JS是单线程运行的,一个线程中,事件循环是唯一的但是任务队列可以拥有多个

宏任务与微任务

  • 在事件循环中,先执行同步任务,后执行异步任务,在异步任务的执行中类型中又分了2种任务:微任务宏任务

宏任务(macro-task)大概包括:

  • script(整体代码)
  • setTimeout---定时器
  • setInterval---计时器
  • setImmediate---立即异步执行一个任务
  • I/O-----node中的内容
  • UI render

微任务(micro-task)大概包括:

  • process.nextTick---立即异步执行一个任务
  • Promise
  • Async/Await
  • MutationObserver(html5新特性)-提供了监视对DOM树所做更改的能力

宏任务与微任务的执行规则

  • 执行宏任务,然后执行该宏任务产生的所有微任务(包括微任务产生的新的微任务),微任务执行完毕后,再回到宏任务中进行下一轮循环。

为什么要区分微任务和宏任务?

执行更快的任务应该先执行,不必等执行耗时就的先执行完。从更底层来说:

  • 微任务是线程之间的切换,速度快。不用进行上下文切换,可以快速的一次性做完所有的微任务。

  • 宏任务是进程之间的切换,速度慢,且每次执行需要切换上下文。因此一个事件循环中只执行一个宏任务。

  • 微任务执行快,一次性可以执行很多个,在当前宏任务执行后立刻清空微任务可以达到伪同步的效果,这对视图渲染效果起到至关重要的作用。

而往往视图的渲染是在宏任务执行之后的,先执行微任务可以确保在视图渲染之前,数据已经更新

node中的事件循环

。。。。。。

参考

# 面试题:说说事件循环机制(满分答案来了)