浏览器的异步策略
上文讲过,浏览器中的渲染进程为了效率和安全问题不能开启多线程来处理问题
但由于渲染主线程的任务太多,总会遇到一些无法立即处理的任务:
1.计时器完成后,需要执行的回调函数
2.网络通信完成后需要执行的任务:XHR、Fetch
3.用户与浏览器之间的交互行为:点击…
为什么js单线程语言
因为渲染进程只能开启一个渲染主线程执行任务,而js代码又是运行在渲染主线程上的,导致js也只能是单线程的
浏览器不做处理的话
如果遇到上述情况,让渲染主线程等待任务执行时机,会导致主线程阻塞,导致以下后果:
- 消息队列中其他任务全部等待执行
- 浏览器每秒画60次页面也无法进行,卡死
- 交互行为得不到反馈
- …
而渲染主线程承担着大量的、复杂的工作,绝对不能阻塞
浏览器的异步
当某些任务发生时,如:定时器、网络通信、交互等
渲染主线程直接将任务交给其他线程处理,自己立即结束任务,转而执行消息队列中的后续任务
当其他线程完成任务后,将事先传递的callback包装成任务,添加到消息队列末尾等待主线程调度执行
这种异步模式下,浏览器永不阻塞!最大限度的保证了单线程的流畅运行
注意
当你操作DOM、滚动滚轮、改变窗口大小…等操作,浏览器需要重新渲染绘制页面,这也是任务,会被添加到消息队列中排队
执行js代码和渲染绘制都在渲染主线程上