说起事件循环,首先先介绍两个概念,“进程”和“线程”。
进程: CPU 在运行指令及加载和保存上下文所需的时间。
线程:是进程中的更小单位,描述了执行一段指令所需的时间。
举个例子:比如打开一个页面就相当于开启了一个进程,这个进程中呢又包含了许多的线程,比如JS线程,ui渲染线程,http请求线程。。。
说到JS线程,大家都知道是单线程的,因为这里有个执行栈(遵循“先进后出”原则),相当于主线程。如果大家都走主线程的话存在堵塞问题,性能较低,所以提出了同步,异步的概念。那同步,异步如何处理的呢?请看流程图(盗用):
哪些是同步任务,哪些是异步任务呢?
同步:js代码;
异步又分两种:
宏任务(macrotask队列):script,setTimeout,setInterval,setImmediate,I/O,UI rendering
微任务(microtask队列):process.nextTick(),promise,mutationObserve
按照“宏任务--->微任务--->UI渲染--->宏任务--->微任务--->UI渲染”一直循环下去,因为js属于宏任务,所以循环是从宏任务开始的,至于优先级就是上面列出的顺序。