Generator 的 return() 方法用于立即终止生成器并返回 { value: ..., done: true } 对象,跳过后续 yield;传入值作为 value,done 恒为 true;即使已结束,多次调用仍返回相同结构;finally 块仍执行,但 for...of 不自动调用 return()。

Generator 的 return() 方法用于立即终止生成器执行,并返回一个形如 { value: ..., done: true } 的对象。它会跳过后续所有 yield 表达式,直接结束迭代。
return() 的基本行为
调用 generator.return(value) 时:
- 生成器函数立即停止执行,不再继续任何未完成的
yield或后续逻辑; - 返回的对象中
value是传入的参数(若未传则为undefined),done恒为true; - 如果生成器已处于
done: true状态,多次调用return()仍返回相同结构的对象(value为首次传入值或undefined)。
与 next()、throw() 的区别
return() 不同于 next() 和 throw():
-
next()推进到下一个yield,可能暂停也可能结束; -
throw()向当前暂停点抛出异常,可被try...catch捕获; -
return()强制终结,不触发catch块,也不执行finally中的清理代码(除非生成器内部有try...finally且尚未退出)。
实际使用示例
看一个典型场景:
立即学习“Java免费学习笔记(深入)”;
function* counter() {
try {
yield 1;
yield 2;
yield 3;
} finally {
console.log('cleanup run');
}
}
<p>const gen = counter();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.return('end')); // { value: 'end', done: true }
// 输出:'cleanup run'
console.log(gen.next()); // { value: undefined, done: true }(已结束,忽略后续调用)注意:finally 块仍会执行 —— 这是 Generator 规范中定义的“清理语义”,即使由 return() 触发也会运行。
配合 for...of 循环的注意事项
for...of 隐式调用 next(),但不会主动调用 return()。如果想提前退出并触发清理,需手动调用:
- 直接调用
generator.return(); - 或使用
break+ 显式return()(因为for...of本身不自动释放资源); - 浏览器/Node.js 环境中,垃圾回收不会自动触发
return(),必须显式调用才能确保finally执行。


















