事件循环
JS引擎对事件队列的取出执行方式,以及与宿主环境的配合,称之为事件循环。
JS运行的环境称之为宿主环境
浏览器宿主环境中包含5个线程:
- JS引擎:负责执行执行栈的最顶部代码
- GUI线程:负责渲染页面
- 事件监听线程:负责监听各种事件
- 计时线程:负责计时
- 网络线程:负责网络通信
事件队列在不同的宿主环境中有所差异,大部分宿主环境会将事件队列进行细分。在浏览器中,事件队列分为两种:
1.宏任务(队列): macroTask,计时器的回调,事件的回调,http等绝大部分异步函数进入宏队列。
2.微任务(队列): MutationObserver(用于监听某个Dom对象的变化),Promise产生的回调进入微队列。当执行栈清空时,JS引擎首先会将微任务中的所有任务依次执行结束,如果没有微任务,则执行宏任务。