同步程序执行完,再执行异步。会出现定时器不准的情况
js 会阻塞渲染 是因为它们运行在同一个线程上
JS 是单线程。因为js只能运行在浏览器的渲染主线程中,而渲染主线程只有一个,而渲染主线程承担着非常的多的事情 , 渲染页面 , 执行js啥啥的 都在里面执行
浏览器的渲染进程 采用何种方式处理定时器任务、交互任务,任务执行顺序的依据 —— 事件循环
浏览器的进程模型
操作系统 进程 线程
随着浏览器功能的丰富。浏览器几乎成为一个“操作系统”
浏览器是多进程多线程应用程序
- 浏览器进程
主要负责:浏览器窗口界面、用户交互、子进程(网路、渲染)管理等
2. 网络进程
加载网络资源
3. 渲染进程 (标签页)
渲染进程
渲染主线程
执行HTMl、CSS、JS代码
线程的任务调度 —— 维护一个消息队列 (任务队列)
这个维护的方式被称为 消息循环 或 事件循环
事件循环
官方叫 event loop
浏览器实现叫 message loop
参考博客
参考视频
运行栈 存储同步任务
任务队列 存储异步任务,存在多个队列,不同队列存在优先级差异
计时器会在到点时,将任务插入到任务队列中
- 任务没有优先级,队列先进先出
- 队列有多条,存在优先级
早期分为 微队列和宏队列
先执行微任务,后执行宏任务
随着浏览器的复杂度急剧提升 W3C不再使用宏队列的说法
提出了任务类型的说法:
一种类型只能在一个队列中,一个队列可包含多种类型。
队列优先级可由浏览器自行决定,
但必须单独一个微队列 绝对优先
在目前chrome的实现中 至少包含了下面的队列:
- 延时队列 : 用于存放计时器到达后的回调任务 , 优先级中
- 交互列队 : 用于存放用户操作后产生的事件处理任务 , 优先级高
- 微队列 : 用户存放需要最快执行的任务 优先级最高
一些方法在事件循环中的执行顺序
异步是如何实现的?
为什么需要异步?
防止渲染被一些任务阻塞
单个任务执行事件较长,也会造成等待