前言
这里我只是写一下我自己对浏览器事件循环的理解,如果错误,欢迎大家指出,谢谢。
在说事件循环之前,我们先来聊聊浏览器,浏览器是一个多进程、多线程的应用,里面有浏览器进程、渲染进程和网络进程等。
浏览器进程:主要负责界面的显示、用户的交互、子进程的管理等
网络进程:负责网络资源的加载
渲染主进程:每一个标签页就是一个渲染主进程
这边是浏览器的进程任务:
上面提到了进程和线程,补充一下:
进程:指操作系统进行资源分配的基本单位,它是一个正在执行程序的一个实例,包含代码程序、数据和进程控制块等信息。
线程:是操作系统进行调度任务的基本单位,是进程中的一个执行路径,包含线程ID、程序计数器。寄存器集合和栈等信息。
回到正题,咱们说的事件循环就是在渲染主进程中的。那渲染主进程到底做了什么操作呢?有哪些任务呢?
像 解析HTML、解析CSS、样式计算、执行JS代码等都是在渲染主进程中的。
这么多任务要怎么安排呢?这边就涉及到了任务的调度了,也就引入了 消息队列
那在我们代码的执行过程中,总会有一些任务不会马上执行,比如延时任务,
如果咱们的任务1 刚好是一个计时任务,如果渲染主进程一直在等待任务1的完成,那任务2就一直处于阻塞状态,一方面造成渲染主线程的资源浪费,另一方面也会给用户造成卡死的现象。
这时候就需要引入异步了。即渲染主进程如果遇到了计时任务,就会把计时任务放到计时线程中等待,等计时完成后就会把计时任务的回调函数包装成一个新任务中,放到消息队列中,渲染主线程会依次从消息队列中取出任务进行执行。
我们知道,在我们生活中,任务是有优先级的,但是在这边,任务是没有优先级的,那渲染主进程怎么区分这些任务的优先呢?
任务没有优先级,但是消息队列有优先级,这边就会涉及到微队列和延时队列、交互队列等。
在渲染主进程执行任务的时候,会优先从咱们得交互队列、微队列、延时队列等队列任务等取出任务依次执行。
优先级:交互队列 > 微队列 > 延时队列
交互队列:存放用户与页面的交互任务等
微队列:promise任务等
延时队列:setTimeout等
上面整个渲染主进程执行任务的流程就是咱们说的事件循环。