简述JavaScript事件循环EventLoop
宏任务包括:
主任务(例如一个script标签,在html中一个script标签就是一个宏任务)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)
微任务包括:
Promise.then
Object.observe
MutaionObserver
process.nextTick(Node.js 环境)
知道了谁是宏任务谁是微任务,也就是有了原料了,怎么加工呢,
第二,就是机制怎么运转
上图解释:
一个js程序(比如一个网页被打开)一开始是酱婶的,为什么只有宏任务有东西。因为开始运行,我们写的代码还没开始执行,底层只能看到我们写的一坨坨代码,也就是主任务。所以一开始,底层会把所有静态主程序怼到宏任务里。等待执行
下面就开始执行了,继续上图
宏1被压入执行栈执行,在宏1执行中有可能产生宏任务和微任务,只要产生宏或微,就按照产生的顺序插入到相应的任务队列尾部。
接下来宏1执行完毕,宏1出栈
接下来,底层会检查微任务队列中有没有任务。如果有就会执行所有等待执行的微任务
在微任务运行过程中也有可能产生微任务和宏任务。一样,只要产生宏或微,就按照产生的顺序插入相应的队尾。
微1执行完毕,出栈,接下来微2会入栈执行,然后是微3入栈执行
所有微任务执行完毕,这时才会重新从宏任务队列中选择下一个任务执行,直到所有任务执行完毕
到此就是一个事件循环的过程,文中把事件循环的过程极其精简化了,就是为了能有一个整体的认识,提供给进一步学习一个框架,希望对大家有帮助。
要想详细的了解event的过程,向大家介绍一本书,阳波的《JavaScript核心技术开发解密》。里面详细的介绍了事件循环的过程,讲的很明白。书封皮是一只橘红色的狐狸