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。完全にジェネレーターの実行を停止し、例外がスローされたときに通常そうであるように呼び出し元で実行が再開されます。
  • ジェネレーター関数の終わり: この場合、ジェネレーターの実行は終了し、valueundefined が、donetrue が代入された IteratorResult オブジェクトが呼び出し元に返ります。
  • return ステートメント。この場合ジェネレーターの実行は終了し、valuereturn ステートメントで指定した値で donetrueIteratorResult オブジェクトが呼び出し元に戻されます。

ジェネレーターの 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 }

仕様

仕様 状態 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Yield の定義
標準 初期定義。
ECMAScript Latest Draft (ECMA-262)
Yield の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 39Edge 完全対応 ありFirefox 完全対応 26
補足
完全対応 26
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
IE 未対応 なしOpera 完全対応 ありSafari 完全対応 10WebView Android 完全対応 39Chrome Android 完全対応 39Edge Mobile 完全対応 ありFirefox Android 完全対応 26
補足
完全対応 26
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 4.0nodejs 完全対応 4.0.0
完全対応 4.0.0
完全対応 0.12
無効
無効 From version 0.12: this feature is behind the --harmony runtime flag.
IteratorResult object instead of throwingChrome ? Edge ? Firefox 完全対応 29IE 未対応 なしOpera ? Safari 完全対応 10WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android 完全対応 29Opera Android ? Safari iOS 完全対応 10Samsung Internet Android ? nodejs ?

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

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 式の解析が最新の ES2015 仕様に準拠するように更新されました(バグ 981599):
    • yield キーワードの後の式はオプションで、省略しても SyntaxError をスローしなくなりました: function* countAppleSales() { yield; }

関連項目

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

このページの貢献者: mfuji09, dlwe, Uemmra3, origami, kdex, chikoski, YuichiNukiyama, mantaroh, teoli, ethertank
最終更新者: mfuji09,