📄事件循环

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 现已抛弃了宏任务的说法
  1. script:整体JS代码,代码执行的基准上下文
  1. timers:setTimeout、setInterval
  1. I/O:
    1. DOM操作
    2. 网络请求(Ajax/Fetch):ajax 属于 I/O,但 ajax 调用的 Promise 回调函数都是微任务。
    3. history.back()
    4. 用户交互:
      1. 包括常见 DOM2(addEventListener)和 DOM0(onHandle)级事件监听回调函数
      2. 特别地,事件需要冒泡到 document 对象之后并且事件回调执行完成后,才算该宏任务执行完成。否则一直存在于执行上下文栈中,等待事件冒泡并事件回调完成。
  1. UI Rendering:渲染是一个Task,通过 Event Loop 来做一帧帧的渲染。
微任务(jobs)
  1. Promise原型方法(then、catch、finally)
  1. MutationObserver
  1. process.nextTick(node)
  1. *Object.observe(已废弃,被现版本Proxy替代)
 
  • Twikoo

© 2021-2024 Tabing | 萌ICP备20240819号