Generator函数通过yield暂停执行,next()恢复并可传值,throw()抛错、return()终止;for...of仅自动遍历,不支持传值与异常控制。

Generator 函数通过 yield 暂停执行,用 next() 方法逐步恢复,本质是手动控制函数的“暂停-继续”节奏。
yield 是暂停点,不是返回值终点
yield 表达式会让函数暂停,并把右侧的值(如 yield 1 中的 1)作为 next() 调用的返回结果中的 value。函数真正暂停的位置在 yield 表达式**执行完之后**,下一次 next() 才从该位置继续。
- 第一次调用
next():执行到第一个yield,暂停,返回{ value: ..., done: false } - 后续每次
next():从上一个yield暂停处继续,直到下一个yield或函数结束 - 函数返回(包括隐式返回
undefined)后,再调用next()都会返回{ value: undefined, done: true }
next() 可以向 generator 传入值
next(value) 的参数会成为**上一个 yield 表达式的返回值**。这是实现双向通信的关键。
例如:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function* g() {
const x = yield 'a';
console.log(x); // 第二次 next(123) 传入的 123 会到这里
yield 'b';
}-
it.next()→ 返回{ value: 'a', done: false },函数停在yield 'a'后 -
it.next(123)→x = 123,继续执行,打印123,然后遇到yield 'b'暂停
throw() 和 return() 主动干预流程
除了 next(),还可以用其他方法中断或终止 generator:
-
it.throw(error):在暂停位置抛出错误,如果 generator 内有try...catch可捕获;未捕获则中止 -
it.return(value):立即结束 generator,返回{ value: value, done: true },忽略后续yield
注意:return() 不会触发 finally 块(如果有),而 throw() 会——这点和普通函数一致。
for...of 自动遍历,但忽略传值能力
for...of 会自动调用 next() 直到 done: true,适合只读场景:
function* nums() { yield 1; yield 2; yield 3; }
for (const n of nums()) console.log(n); // 1 2 3但它**无法传入值给 yield**,也不响应 throw() 或 return()。需要精细控制时,必须显式使用迭代器对象和 next() 等方法。

















