浅谈 Javascript 事件循环

进程和线程

  • 进程是资源分配的最小单位,进程由一个或者多个线程组成
  • 线程是资源调度的最小单位,同个进程之中的多个线程之间共享该进程的资源

类比:CPU(工厂)——进程(车间)——线程(工人)

浏览器内核

浏览器内核是多线程的,通常由以下几个常驻线程组成:

  • GUI 渲染线程:渲染页面,重绘或回流时,该线程会执行。与 JS 引擎互斥,JS 引擎空闲时才会被执行
  • JS 引擎线程:负责处理 Javascript 语句,单线程工作。和 GUI 渲染线程互斥,运行耗时过长就会阻塞页面
  • 事件触发线程:当事件被触发时,该线程会把对应的事件回调函数添加到任务队列的队尾
  • 定时器触发线程:因为 JS 单线程,计时容易阻塞,所以需要单独线程
  • 异步 http 请求线程:浏览器新开一个线程请求,将回调函数分发到任务队列

事件循环

同步任务进入主执行栈,异步任务进入任务队列。主执行栈内的任务执行完毕,会去任务队列读取一条任务,推入主执行栈。上述过程的不断重复就事件循环

宏任务微任务

  • 宏任务主要包含:script(整体代码)、setTimeout、setInterval、I/O、UI 交互事件
  • 微任务主要包含:Promise、MutaionObserver(监听 Dom 树的变化)

宏任务中的回调函数会分发到宏任务队列,微任务的回调函数会分发到微任务队列,主执行栈中的任务执行完后会先清空微任务队列,再从宏任务队列取一个任务放到主执行栈

除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1099.html
京ICP备19044523号-1