yield是生成器函数的暂停与恢复机制,用于按需产出值、接收外部参数,并通过yield*委托其他可迭代对象。

在生成器函数中,yield 不是用来“控制流程”的指令,而是用来暂停和恢复函数执行的机制——它让函数交出执行权,把值返回给调用者,等下次调用再从暂停处继续。
yield 的本质是暂停点
yield 出现的地方就是生成器函数的暂停位置。每次调用生成器对象的 next() 方法,函数会从上次暂停处继续运行,直到遇到下一个 yield 或函数结束。
- 第一次调用
next():从函数开头执行,遇到第一个yield就暂停,返回该表达式的值 - 后续调用
next():从上次暂停处继续,可传入参数,这个参数会成为上一个yield表达式的返回值 - 函数执行完毕后,再次调用
next()会返回{ done: true, value: undefined }
用 yield 实现分步计算
比如生成斐波那契数列,不需要一次性算完所有项,而是按需产出:
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
<p>const fib = fibonacci();
console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2yield 可接收外部传入的值
yield 表达式本身可以像变量一样被赋值——下一次 next(value) 传入的值,会成为当前 yield 的返回值:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
function* ask() {
const name = yield 'What is your name?';
yield `Hello, ${name}!`;
}
<p>const q = ask();
console.log(q.next().value); // 'What is your name?'
console.log(q.next('Alice').value); // 'Hello, Alice!'注意:第一次 next() 不能传参(引擎尚未进入函数体),传了也会被忽略。
yield* 委托另一个生成器
当需要把控制权转交给另一个可迭代对象(尤其是其他生成器)时,用 yield*,它会自动遍历并逐个产出值:
function* numbers() { yield 1; yield 2; }
function* letters() { yield 'a'; yield 'b'; }
<p>function<em> combined() {
yield</em> numbers(); // 展开 numbers() 的所有产出
yield* letters(); // 再展开 letters()
}</p><p>[...combined()]; // [1, 2, 'a', 'b']这比手动循环 for...of 更简洁,也保持了生成器的惰性特性。

















