Skip to content

浏览器进程

浏览器内部会启动多个进程来管理处理不同的任务

浏览器主进程

负责界面显示,与用户交互,如前进,后退等

网络进程

负责网络资源加载,使用线程池处理

渲染进程(重点关注)

负责页面渲染,一个渲染进程负责渲染一个页面,渲染进程可以有多个线程,如GPU线程,JS引擎线程。也就是说执行 htmljscss

渲染主线程工作步骤

  1. 解析html
  2. 解析css
  3. 计算样式(比如em转换px)
  4. 布局
  5. 处理图层
  6. 以fps60渲染
  7. 执行全局js代码
  8. 执行事件处理函数
  9. 执行计时器的回调函数 ....

消息队列(message queue)

  1. 最开始的时候,渲染主进程会无限循环
  2. 每一次循环都会检查消息队列中是否有任务,如果有就会执行消息队列第一个任务,如果没有就休眠
  3. 其他线程可以随时向消息队列中加入任务,新任务会添加到末尾,如果主进程休眠状态,将会唤醒执行任务 整个过程就被成为是消息队列

WARNING

  1. 队列有不同任务队列有多个:交互队列、延时队列
  2. 一定有有微任务队列,而且最优先执行

如何理解异步

因为js单线程语言,他是执行在渲染主线程里面, 渲染主线程有诸多工作,比如解析html解析css计算样式布局处理图层、如果使用同步的方式,那么渲染主线程将会被阻塞,所以浏览器把耗时任务:setTimeout网络请求事件监听交给其他线程处理,然后加入到消息队列末尾,这种异步模式下面,浏览器永不阻塞

阐述Js的事件循环

事件循环又称消息循环,是浏览器渲染主线程的工作方式.

js可以计数器能够精确吗?

不能

  1. w3c规定js的计时器当超过4层精度会有4ms偏差
  2. setTimeout只有在主线程空闲时候才可以执行,所以也有偏差