Generator(生成器)是 JavaScript 中一种可暂停和恢复执行的函数,通过 function* 语法定义,使用 yield 关键字产出值。

解决的核心痛点:普通函数必须执行完毕才能返回结果,无法中间暂停;Generator 打破了这一限制,让函数可以分步执行、按需产生值,实现惰性计算。


核心命题


运行机制

graph TB
    A[调用 Generator 函数] --> B[返回迭代器]
    B --> C[调用 next]
    C --> D{是否有 yield?}
    D -->|是| E[执行到 yield,产出值]
    E --> F[暂停函数]
    F --> C
    D -->|否| G[执行完毕]
    G --> H[done: true]
  1. function* 定义 Generator 函数
  2. 调用函数返回迭代器(不执行函数体)
  3. next() 执行到下一个 yield,产出值并暂停
  4. 最后一个 yield 后执行完毕,done: true

关键区别

维度Generator普通函数async 函数
执行方式可暂停/恢复执行到返回自动执行
返回值迭代器直接返回值Promise
控制流手动(next)自动自动
产出值多次(yield)一次(return)一次

应用场景

  • 适用场景
    • 惰性迭代:按需生成数据,避免一次性加载
    • 状态机:实现复杂状态转换逻辑
    • 异步流程控制:手动的异步流程控制(async/await 出现前)
    • 无限序列:生成无限数列或数据流
  • 误用
    • 简单遍历:能用 for…of 时不必用 Generator
    • 忘记结束条件:可能导致无限循环

知识图谱


参考延伸