JS yield 表达式

🌙
手机阅读
本文目录结构

yield 关键字用来暂停和恢复一个生成器函数((function* 或遗留的生成器函数)。

语法

[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 给调用者返回 undefined 并且 done 为 true。
  • 到达 return 语句。在这种情况下,生成器的执行结束,并将 IteratorResult 返回给调用者,其值是由 return 语句指定的,并且 done 为 true。 如果将参数传递给生成器的 next() 方法,则该值将成为生成器当前 yield 操作返回的值。

在生成器的代码路径中的 yield 运算符,以及通过将其传递给 Generator.prototype.next() 指定新的起始值的能力之间,生成器提供了强大的控制力。

示例

以下代码是一个生成器函数的声明。

function* countAppleSales () {
  var saleList = [3, 7, 5];
  for (var i = 0; i < saleList.length; i++) {
    yield saleList[i];
  }
}

一旦生成器函数已定义,可以通过构造一个迭代器来使用它。

var 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 }

规范

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Yield
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
Yield
Draft

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了