事件循环
同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。
当指定的事情完成时,Event Table会将这个函数移入Event Queue。
主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
上述过程会不断重复,也就是常说的Event Loop(事件循环)。
JS执行过程图原理图
说明
JS是单线程的
- JS 中用来存储待执行回调函数的队列包含2个不同特定的队列
-
宏队列:用来保存待执行的宏任务(回调),比如:定时器回调/DOM 事件回调/ajax 回调
-
微队列:用来保存待执行的微任务(回调),比如:promise 的回调/MutationObserver 的回调还有如 I/O 操作、UI 渲染
- JS 执行时会区别这2个队列
-
JS 引擎首先必须执行所有的初始化同步任务代码
-
每次准备取出第一个宏任务microtask前,都要将所有的microtask微任务一个一个取出来执行
总结: 同步任务——微队列——宏队列
例子
setTimeout(() => {
// 放入宏队列 3
console