Skip to content

浏览器进程 ​

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

浏览器主进程 ​

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

网络进程 ​

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

渲染进程(重点关注) ​

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

渲染主线程工作步骤 ​

  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只有在主线程空闲时候才可以执行,所以也有偏差