生成器函数通过yield暂停执行,由next()逐步恢复,本质是手动协程;yield返回{value:...,done:false}并保留状态,next()可传参赋值给前一个yield左侧变量,throw()和return()可主动干预执行,for...of仅支持无参遍历。

生成器函数通过 yield 暂停执行,靠迭代器的 next() 方法逐步恢复,本质是“手动协程”——每次调用 next() 才运行到下一个 yield。
yield 是暂停点,不是返回点
yield 表达式会让函数暂停,并把右侧值作为 { value: ..., done: false } 的 value 返回;函数状态(作用域、执行位置)被完整保留。下一次 next() 调用时,从 yield 后面继续执行。
- 第一次
next():运行到第一个yield,暂停并返回该值 - 后续
next(value):把传入的value赋给前一个yield表达式(即let x = yield 1中的x),再继续执行 - 函数结束或遇到
return,返回{ value: ..., done: true }
用 next() 传递数据,控制流向
生成器不只单向产出,还能接收外部输入。这使得它能实现条件分支、状态机甚至异步流程控制。
-
gen.next()启动,不传参,yield左侧变量得到undefined -
gen.next('a')会把'a'赋给上一个yield的左侧(如const cmd = yield 'ready';中cmd变为'a') - 可根据传入值决定下一步逻辑:
if (cmd === 'start') yield 'running'; else yield 'idle';
throw() 和 return() 主动干预执行
除了 next(),还可以用其他方法强行改变状态:
-
gen.throw(error):在暂停处抛出错误,可被生成器内部try...catch捕获;若未捕获,则生成器终结 -
gen.return(value):立即结束生成器,返回{ value: value, done: true };后续next()都返回{ value: undefined, done: true } - 这些方法让生成器具备“可中断”“可终止”能力,适合做任务调度或资源清理
配合 for...of 自动消费(但有局限)
for...of 会隐式调用 next() 直到 done: true,写起来简洁,但无法传参、无法处理异常、也无法中途退出(除非 break)。
- 适合只读遍历场景,比如生成无限序列:
function* fib() { let a=0,b=1; while(true) { yield a; [a,b] = [b,a+b]; } } - 若需交互或错误处理,必须显式调用
next()、throw()等 -
Array.from(gen)或[...gen]也属于自动消费,同样不能传参
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











