非常教程

JavaScript参考手册

Operators

yield

yield关键字用于暂停和恢复生成器函数(function*或传统生成器函数)。

句法

[rv] = yield [expression];

expression定义通过迭代器协议从生成器函数返回的值。如果省略,则返回undefinedrv

返回传递给生成器next()方法的可选值以恢复其执行。

描述

yield关键字暂停生成器功能执行和下面的表达式的值yield的关键字返回到发生器的调用者。它可以被认为是return关键字的基于生成器的版本。

yield关键字实际上返回一个IteratorResult具有两个属性的对象,valuedonevalue属性是评估的结果yield表达,并且donefalse,指示生成器函数还没有完全完成。

暂停yield表达式之后,生成器的代码执行将保持暂停状态,直到next()调用生成器的方法。每次next()调用生成器的方法时,生成器都会恢复执行并运行,直到达到以下之一:

  • yield,它使发生器再次暂停并返回发生器的新值。下一次next()被调用时,执行会立即在语句后重新开始yield
  • throw用于从生成器中抛出异常。这完全停止生成器的执行,并且执行在调用者中恢复,正如在抛出异常时一样。
  • 生成器函数结束;在这种情况下,生成器的执行结束,并且IteratorResult返回给valueis undefineddoneis 的调用者true
  • return达成了一项声明。在这种情况下,发电机的执行结束和IteratorResult被返回给调用者,其中所述value的由指定的值return语句和donetrue

如果将可选值传递给生成器的next()方法,则该值将成为生成器当前yield操作返回的值。

在生成器的代码路径,其yield运营商以及通过传递给它指定新的起始值的能力之间Generator.prototype.next(),生成器提供了巨大的动力和控制力。

示例

The following code is the declaration of an example generator function.

function* foo() {
  var index = 0;
  while (index <= 2)
    yield index++;
}

一旦定义了生成器函数,就可以通过构造一个迭代器来使用它,如图所示。

var iterator = foo();
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

规范

规范

状态

评论

ECMAScript 2015(第6版,ECMA-262)该规范中'收益'的定义。

标准

初始定义。

ECMAScript最新草案(ECMA-262)该规范中“收益率”的定义。

Living Standard

浏览器兼容性

Feature

Chrome

Edge

Firefox (Gecko)

Internet Explorer

Opera

Safari (WebKit)

Basic support

39

(Yes)

26.0 (26.0)

?

?

10

IteratorResult object instead of throwing

?

?

29.0 (29.0)

?

?

10

Feature

Android

Edge

Firefox Mobile (Gecko)

IE Mobile

Opera Mobile

Safari Mobile

Basic support

(Yes)

(Yes)

26.0 (26.0)

?

?

10

IteratorResult object instead of throwing

?

?

29.0 (29.0)

?

?

10

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络