事件循环

68 阅读2分钟

事件循环****

浏览器进程:****

负责界面展示、用户交互,子进程管理。历览器内部会启动多个线程处理不同的任务。

网络进程:****

负责加载网络进程。

渲染进程:****

渲染进程启动后,会开启一个渲染主线程,主线程负责执行HTML,CSS,JS代码。

渲染主线程:****

1、解析HTML

2、解析CSS

3、计算样式

4、布局

5、处理图像

6、每秒把页面画60次

7、执行全局JS代码

8、执行事件处理函数

9、执行计数器的回调函数

………..

 

1、  在最开始的时候,渲染主线程会进入一个无线循环。

2、  在每一次循环会检查消息队列中是否有任务存在。如果有,就取出第一个任务执行,执行完第一个后进入下一次循环;如果没有,则进入休眠状态。

3、  其他所有线程(包括其他进程的线程)可以随时向消息队列增添任务。新任务会加到消息队列的末尾。在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务。

整个过程,被称为事件循环(或者消息循环)

何为异步?

代码在执行过程中,会遇到一些无法立即执行的任务,比如:

及时完成后需要立即执行——setTimeout,setInterval

网络通信完成后需要执行的任务——XHR,Fetch

用户操作后需要执行的任务——addEventListener

 

如何理解 JS 的异步?****


什么叫全局队列?****

当嵌套超过5层时候,为什么最小间隔事件变成4ms .

任务有优先级吗?

任务没有优先级,在消息队列中的先进先出

消息队列是有优先级的。

 

目前的chrome的实现中,至少包含下面的队列:

延时队列:用于存放计时器达到后的回调任务,优先级【中】

交互队列:用于存放用户操作后产生的事件处理任务,优先级【高】

微队列:用户存放需要最快执行的任务,优先级【最高】****


****

输出结果为:54312

 

单线程是异步产生的原因

事件循环的异步的实现方式****