什么是事件循环
事件循环是处理异步任务的机制, 包含以下概念:
- 宏任务队列: 存放异步任务的回调函数, 包括事件回调, 定时器回调等
- 调用栈: JavaScript 是单线程的, 即同一时间内只能执行一个函数, 调用栈用于存放当前正在执行的函数, 又叫同步任务, 每当一个函数被调用则压入调用栈, 函数执行完从栈中弹出, 嵌套函数同理
- 微任务队列: 存放比宏任务优先级更高的异步任务回调函数, 比如 Promise 回调, MutationObserver 回调
处理过程遵循以下步骤:
- 清空调用栈: 依次执行调用栈中的同步任务, 过程中遇到异步任务, 将回调存放到对应任务队列中
- 清空微任务队列: 清空调用栈后, 优先一次性执行完所有微任务, 依次从微任务队列取出回调并压入调用栈
- 渲染: 清空微任务队列, 如果需要, 浏览器会尝试进行页面渲染
- 处理宏任务队列: 每次只取一个任务, 压入调用栈, 回到最开始的步骤