此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
yield
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
yield 关键字用于暂停和恢复生成器函数。
In this article
尝试一下
function* foo(index) { while (index < 2) { yield index; index++; }}const iterator = foo(0);console.log(iterator.next().value);// Expected output: 0console.log(iterator.next().value);// Expected output: 1语法
[rv] = yield [expression];
expression定义通过迭代器协议从生成器函数返回的值。如果省略,则返回
undefined。rv返回传递给生成器的
next()方法的可选值,以恢复其执行。
描述
yield 关键字使生成器函数执行暂停,yield 关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return 关键字。
yield 关键字实际返回一个IteratorResult 对象,它有两个属性,value 和done。value 属性是对yield 表达式求值的结果,而done 是false,表示生成器函数尚未完全完成。
一旦遇到yield 表达式,生成器的代码将被暂停运行,直到生成器的next() 方法被调用。每次调用生成器的next() 方法时,生成器都会恢复执行,直到达到以下某个值:
yield,导致生成器再次暂停并返回生成器的新值。下一次调用next()时,在yield之后紧接着的语句继续执行。throw用于从生成器中抛出异常。这让生成器完全停止执行,并在调用者中继续执行,正如通常情况下抛出异常一样。- 到达生成器函数的结尾。在这种情况下,生成器的执行结束,并且
IteratorResult给调用者返回value的值是undefined并且done为true。 - 到达
return语句。在这种情况下,生成器的执行结束,并将IteratorResult返回给调用者,其value的值是由return语句指定的,并且done为true。
如果将参数传递给生成器的next() 方法,则该值将成为生成器当前yield 操作返回的值。
在生成器的代码路径中的yield 运算符,以及通过将其传递给Generator.prototype.next() 指定新的起始值的能力之间,生成器提供了强大的控制力。
警告:不幸地是,next() 是不对称的,但这并不是没有帮助:它总是向当前暂停的yield 发送一个值,但是返回的是yield 之后表达式的运算结果。
示例
>使用 yield
以下代码是一个生成器函数的声明。
function* countAppleSales() { const saleList = [3, 7, 5]; for (let i = 0; i < saleList.length; i++) { yield saleList[i]; }}一旦生成器函数已定义,可以通过构造一个迭代器来使用它。
const appleStore = countAppleSales(); // Generator { }console.log(appleStore.next()); // { value: 3, done: false }console.log(appleStore.next()); // { value: 7, done: false }console.log(appleStore.next()); // { value: 5, done: false }console.log(appleStore.next()); // { value: undefined, done: true }你也可以将带有next(value) 的值发送给生成器。在rv = yield expression 这个语法中,step 用于接收返回值——尽管第一次调用next() 时忽略传递给生成器next() 方法的值。
function* counter(value) { let step; while (true) { step = yield value++; if (step) { value += step; } }}const generatorFunc = counter(0);console.log(generatorFunc.next().value); // 0console.log(generatorFunc.next().value); // 1console.log(generatorFunc.next().value); // 2console.log(generatorFunc.next().value); // 3console.log(generatorFunc.next(10).value); // 14console.log(generatorFunc.next().value); // 15console.log(generatorFunc.next(10).value); // 26规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # prod-YieldExpression> |