generator函数通过yield暂停执行并返回迭代器;每次调用next()恢复运行,保留函数状态,yield右侧值作为value返回,可接收next(value)传入的参数,用于异步流程、状态机等场景。

Generator 函数通过 yield 暂停执行,返回一个迭代器对象;每次调用 next() 时恢复,从上次暂停处继续运行,直到下一个 yield 或函数结束。
yield 是暂停点,不是 return
yield 会让函数暂停,并把右侧表达式的值作为 next() 调用的返回结果中的 value。函数状态(作用域、执行位置)被完整保留,下次恢复时变量依然存在。
- 第一次调用
next()启动函数,执行到第一个 yield 就暂停 - 后续
next()会从暂停处继续,执行下一行,直到下一个 yield 或函数返回 -
yield 表达式本身没有返回值(类似
undefined),但可以接收next(value)传入的参数,赋给左侧变量
用 next() 控制执行节奏
Generator 返回的是迭代器,必须手动调用 next() 才能推进。每次调用返回形如 { value: ..., done: true/false } 的对象。
-
next()不带参数:启动或继续执行,yield 左侧接收到undefined -
next(value)带参数:该value成为上一个 yield 表达式的返回值(即赋给let x = yield ...中的x) - 函数结束后再调用
next(),done为true,value是函数return的值(或undefined)
常见使用模式:异步流程与状态机
Generator 本身不处理异步,但配合 Promise 和外部调度(比如 co 库或手写 runner),可让 yield 等待 Promise 结果,实现类 async/await 的写法。
- 把异步操作包装成 Promise,yield 它,由执行器等待 resolve 后再调用
next(result) - 适合构建有限状态机:每个 yield 对应一个状态,
next()触发状态迁移 - 可用于生成无限序列(如斐波那契)、分块处理大数据、协程式协作调度等场景
注意陷阱:yield 只能在 Generator 函数内使用
yield 是关键字,不能出现在普通函数、箭头函数或 Generator 外部。试图在非 Generator 中使用会报语法错误。
- Generator 函数声明以
function*开头(星号可紧贴 function 或函数名) - 调用 Generator 函数不立即执行,而是返回迭代器对象
- 不能用
new实例化 Generator 函数,会抛出 TypeError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











