📄事件循环
type
status
date
slug
summary
tags
category
icon
password
Status
JS虽然是单线程,但是具备执行异步任务的能力,在宿主环境通过事件循环实现。
浏览器
W3C描述中存在两种事件循环,一种即在
browsing context
下的事件循环,另一种是在 web workers
下的循环。我们更多关注
browsing context
下的事件循环。浏览器中的事件循环始终以一个宏任务(如有)开始,等待
execution context stack
为空(这很重要)时将执行 perform a microtask checkpoint
,即执行 microtask queue
中的 microtasks
。待 microtask queue
清空后,将进入渲染进程,此刻浏览器应该判断是否有必要进入 repaint
流程。经历渲染步骤之后,一个事件循环结束。JS执行流可能有三种情况,我们把异步任务产生的来源叫事件源:
同步代码(JS执行栈/回调栈)
宏任务(tasks):W3C 现已抛弃了宏任务的说法
- script:整体JS代码,代码执行的基准上下文
- timers:setTimeout、setInterval
- I/O:
- DOM操作
- 网络请求(Ajax/Fetch):
ajax
属于I/O
,但ajax
调用的Promise
回调函数都是微任务。 - history.back()
- 用户交互:
- 包括常见 DOM2(
addEventListener
)和 DOM0(onHandle
)级事件监听回调函数 - 特别地,事件需要冒泡到
document
对象之后并且事件回调执行完成后,才算该宏任务执行完成。否则一直存在于执行上下文栈中,等待事件冒泡并事件回调完成。
- UI Rendering:渲染是一个Task,通过 Event Loop 来做一帧帧的渲染。
微任务(jobs)
- Promise原型方法(then、catch、finally)
- MutationObserver
- process.nextTick(node)
- *Object.observe(已废弃,被现版本Proxy替代)
- Twikoo