浏览器进程
浏览器内部会启动多个进程来管理处理不同的任务
浏览器主进程
负责界面显示,与用户交互,如前进,后退等
网络进程
负责网络资源加载,使用线程池处理
渲染进程(重点关注)
负责页面渲染,一个渲染进程负责渲染一个页面,渲染进程可以有多个线程,如GPU线程,JS引擎线程。也就是说执行 html、js、css
渲染主线程工作步骤
- 解析html
- 解析css
- 计算样式(比如
em转换px) - 布局
- 处理图层
- 以fps60渲染
- 执行全局js代码
- 执行事件处理函数
- 执行计时器的回调函数 ....
消息队列(message queue)
- 最开始的时候,渲染主进程会无限循环
- 每一次循环都会检查
消息队列中是否有任务,如果有就会执行消息队列第一个任务,如果没有就休眠 - 当
其他线程可以随时向消息队列中加入任务,新任务会添加到末尾,如果主进程休眠状态,将会唤醒执行任务 整个过程就被成为是消息队列
WARNING
- 队列有不同任务队列有多个:交互队列、延时队列
- 一定有有微任务队列,而且最优先执行
如何理解异步
因为js是单线程语言,他是执行在渲染主线程里面, 渲染主线程有诸多工作,比如解析html、解析css、计算样式、布局、处理图层、如果使用同步的方式,那么渲染主线程将会被阻塞,所以浏览器把耗时任务:setTimeout、网络请求、事件监听交给其他线程处理,然后加入到消息队列末尾,这种异步模式下面,浏览器永不阻塞
阐述Js的事件循环
事件循环又称消息循环,是浏览器渲染主线程的工作方式.
js可以计数器能够精确吗?
不能
- w3c规定js的计时器当超过4层精度会有
4ms偏差 setTimeout只有在主线程空闲时候才可以执行,所以也有偏差
指南