generator函数的next(value)方法将value作为上一个yield表达式的返回值,而非当前yield的产出;首次调用next()传参被忽略,后续调用的参数赋给前一个yield左侧变量。

Generator 函数的 next() 方法不仅可以获取 yield 表达式的返回值,还能向生成器内部传入参数——这个参数会成为上一个 yield 表达式的返回值。
参数传递发生在“恢复执行时”
关键点在于:你调用 next(value) 传入的 value,不会影响当前这次 yield 的产出,而是作为**前一个 yield 表达式本身的返回值**。也就是说,参数是在生成器从暂停状态恢复执行时,赋给上一条 yield 左边的变量(或表达式)的。
- 第一次调用
next()通常不传参(或传参会被忽略),因为还没有上一个yield等待接收值 - 第二次及之后的
next(x),x就是上一次yield表达式的返回值
基本用法示例
看这段代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function* gen() {
const a = yield 'first';
console.log('a:', a); // 第二次 next(10) 传入的 10 会到这里
const b = yield 'second';
console.log('b:', b);
}
执行过程:
-
const g = gen();—— 创建生成器对象,尚未执行 -
g.next();→{ value: 'first', done: false },函数执行到yield 'first'暂停,a还未赋值 -
g.next(10);→{ value: 'second', done: false },此时yield 'first'表达式返回10,所以a = 10,然后继续执行到下一个yield -
g.next(20);→{ value: undefined, done: true },b = 20,函数执行完
实际应用:实现可交互的生成器逻辑
利用这个机制,可以让生成器根据外部输入动态调整行为:
function* counter() {
let count = 0;
while (true) {
const step = yield count;
count += step ?? 1; // 如果没传参,默认加 1
}
}
<p>const c = counter();
c.next(); // { value: 0, done: false }
c.next(5); // { value: 5, done: false } → 加了 5
c.next(-2); // { value: 3, done: false } → 加了 -2
c.next(); // { value: 4, done: false } → 没传参,加默认值 1</p>
注意事项
常见误区要避开:
- 首次
next()传参无效(V8 引擎会静默忽略,但严格模式可能报错) -
yield是表达式,有返回值;而return是语句,不参与这个传参链 - 如果生成器已结束(
done: true),再调用next()传参也无意义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










