<p>生成器函数调用 return 会立即结束迭代并返回 { value: 指定值, done: true },后续 next() 均返回 { value: undefined, done: true };return 触发正常完成,执行 finally,不抛错,且 yield* 会透传被委托生成器的 return 值。</p>

JavaScript 中生成器函数(Generator Function)调用 return 会立即结束迭代,并将返回值作为 { value: ..., done: true } 的 value,后续再调用 next() 都会返回 { value: undefined, done: true }。
return 会触发 done: true 并携带指定值
在生成器内部使用 return(或执行到函数末尾),会终结当前迭代过程。它和 throw 不同,不会抛错,而是正常完成,但比 yield 更早终止:
-
return后的代码不再执行 - 返回的对象中
done为true,value是return后的表达式值(可为任意类型,包括undefined) - 之后所有
next()调用都返回{ value: undefined, done: true }
示例:
function* gen() {
yield 1;
return 'done';
yield 2; // 这行永远不会执行
}使用时:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const g = gen();
console.log(g.next()); // { value: 1, done: false }
console.log(g.next()); // { value: 'done', done: true }
console.log(g.next()); // { value: undefined, done: true }return 和 yield* 中的 return 行为一致
当用 yield* 委托另一个生成器时,被委托生成器的 return 值会成为 yield* 表达式的返回值:
function* inner() {
yield 'a';
return 'inner-done';
}
<p>function<em> outer() {
yield</em> inner(); // 等价于手动遍历 inner()
yield 'b';
}</p><p>const o = outer();
console.log(o.next()); // { value: 'a', done: false }
console.log(o.next()); // { value: 'inner-done', done: true } ← inner 的 return 值
console.log(o.next()); // { value: 'b', done: false } ← 注意:outer 还没结束!
console.log(o.next()); // { value: undefined, done: true }return 不等于 throw,也不影响 try...finally
return 是正常退出路径,因此会执行 try...finally 中的 finally 块:
function* gen() {
try {
yield 1;
return 'exiting';
} finally {
console.log('cleanup ran');
}
}
// 输出:
// cleanup ran
// { value: 'exiting', done: true }而 throw 也会触发 finally,但行为不同——它可能被 catch 捕获,也可能中断迭代并抛出错误。
实际用途:提前结束 + 返回状态信息
比起单纯用 break 或控制循环变量,return 在生成器中更适合表达「有结果地终止」,比如:
- 搜索类迭代器找到目标后,
return result表明成功并携带结果 - 资源清理型生成器,在
return前释放句柄或关闭连接(配合finally更稳妥) - 构建可组合的异步流程时,用
return传递最终状态给上层逻辑
注意:不要依赖 return 来「跳过」大量中间 yield;若逻辑复杂,建议用条件判断或提前 return 控制流,而非靠 return 终止来“优化”性能。

















