Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

この記事は編集レビューを必要としています。ぜひご協力ください


yield キーワードはジェネレータ関数の一時停止と再開で利用します。(function* または legacy generator function)。

構文

[rv] = yield [expression];
expression
iterator protocol 経由で取得したジェネレータ関数を定義します。もし省略した場合、 undefined が戻ってきます。
rv

ジェネレーターの実行を再開する next() メソッドに渡したオプションの値が戻ってきます。

説明

yield キーワードは、ジェネレーター関数の実行を一時停止し、ジェネレーターの呼び出し元に yield キーワードに続く値を戻します。これは、return キーワードのジェネレーター版と考えることができます。

実際には、yield キーワードは valuedone の 2 つのプロパティを持つ IteratorResult オブジェクトを戻します。value プロパティは、yield 式を評価した結果であり、 done プロパティはジェネレーター関数が完全には完了していないことを示す false です。

一度 yield 式によって停止されると、ジェネレーターの next() メソッドが呼び出されるまで、ジェネレーターのコード実行は一時停止します。ジェネレーターの next() メソッドが呼ばれるたびに、ジェネレーターの実行が再開され、次のうちのいずれかに達するまで実行されます:

  • ジェネレーターを再び停止して、ジェネレーターの新しい値を返す yield。再度 next() が呼ばれると yield の直後から実行が再開されます。
  • ジェネレーターから例外をスローするために使用される throw。完全にジェネレーターの実行を停止し、例外がスローされたときに通常そうであるように呼び出し元で実行が再開されます。
  • ジェネレーター関数の終わりに到達;この場合、ジェネレーターの実行は終了し、valueundefineddonetrue である IteratorResult オブジェクトが呼び出し元に戻されます。
  • return ステートメントに到達。この場合、ジェネレーターの実行は終了し、valuereturn ステートメントで指定した値で donetrueIteratorResult オブジェクトが呼び出し元に戻されます。

ジェネレーターの next() メソッドにオプションの値が渡された場合、その値はジェネレーターの現在の yield 操作が戻す値になります。

ジェネレーターのコードパスの間の yield 操作と Generator.prototype.next() に新しい値を渡す能力で、ジェネレーターは大きな力と制御を提供します。

次のコードはジェネレーター関数の定義例です。

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 (6th Edition, ECMA-262)
Yield の定義
標準 初期定義。
ECMAScript 2017 Draft (ECMA-262)
Yield の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート 39 26.0 (26.0) ? ? ?
例外をスローする代わりに、IteratorResult オブジェクトを返す ? 29.0 (29.0) ? ? ?
機能 Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) 26.0 (26.0) ? ? ?
例外をスローする代わりに、IteratorResult オブジェクトを返す ? 29.0 (29.0) ? ? ?

Firefox 特有の注記

  • Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) から、完了したジェネレーターは TypeError "generator has already finished" をスローしません。代わりに、{ value: undefined, done: true } のような IteratorResult オブジェクトを戻します(バグ 958951)。
  • Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) から、yield 式の解析が最新の ES6 仕様に準拠するように更新されました(バグ 981599):
    • yield キーワードの後の式はオプションで、省略しても SyntaxError をスローしなくなりました: function* foo() { yield; }

関連項目

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama, mantaroh, teoli, ethertank
 最終更新者: YuichiNukiyama,