事件循环
约 528 字大约 2 分钟
2025-03-14
提问
- 请说说什么是事件循环
- 说说你对JS异步的理解 / JS为什么会阻碍渲染
事件循环
事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。
在 Chrome 浏览器源码中,它开启一个不会结束的for循环,每次循环从消息队列中取出第一个任务执行。其他线程产生的任务会加入到队列末尾。
具体来说,每个任务都有不同的类型,而现代浏览器中会维护多个任务队列,不同任务队列中的任务对象具有不同的类型和执行优先级。不同的浏览器 实现这一功能时有所不同(队列个数不尽相同),但是其中必定会有一条微队列,其中的任务具有最高优先级,必须优先调度执行。
JS异步的理解
首先,JS是一门单线程的语言——因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。
渲染主线程承担着渲染页面、执行JS脚本等工作,如果采用同步的运行策略,就极可能导致主线程产生阻塞,导致其他任务无法得到执行。这样会导致 主线程工作效率极低,同时导致页面无法及时更新,面向用户就是卡死。
所以浏览器采用异步的策略来避免阻塞。具体来说是在某些任务(如计时器、网络、事件监听)发生时,主线程将任务交给其他线程处理,自身立刻结束 任务执行,转而执行后续代码。当其他线程完成任务时,会把事先传递的回调函数包装成任务对象,加入到消息队列末尾等待主线程调度执行。
这种模式下,浏览器用不阻塞,从而最大程度保证了浏览器的流畅运行。