yield

yield キーワードは、ジェネレーター関数 (function* または古いジェネレーター関数) のを一時停止したり再開したりするために使用します。

構文

[rv] = yield [expression]
expression Optional
iterator プロトコル経由でジェネレーター関数が返す値を定義します。省略した場合、代わりに undefined が返されます。
rv Optional

ジェネレーターの実行を再開する next() メソッドに渡したオプションの値を受け取ります。

解説

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

yield はそれを含むジェネレーター関数の中で直接しか呼び出すことしかできません。呼び出し先の関数やコールバックから呼び出すことはできません。

yield キーワードはジェネレーターの next() メソッドを呼び出させ、 valuedone の2つのプロパティを持つ IteratorResult オブジェクトを返します。 value プロパティは yield 式の評価結果であり、 donefalse、すなわちジェネレーター関数が完全には完了していないことを示します。

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

  • ジェネレーターを再び停止して、ジェネレーターの新しい値を返す yield。再度 next() が呼ばれると yield の直後から実行が再開されます。
  • ジェネレーターから例外を発生させるために使用される throw。完全にジェネレーターの実行を停止し、 (通常の例外が発生した場合のように) 呼び出し元で実行が再開されます。
  • ジェネレーター関数の末尾。この場合、ジェネレーターの実行は終了し、 IteratorResult オブジェクトの valueundefined が、 donetrue が代入されて呼び出し元に返されます。
  • return ステートメント。この場合はジェネレーターの実行は終了し、 IteratorResult オブジェクトの valuereturn ステートメントで指定した値が、 donetrue が代入されて呼び出し元に返されます。

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

ジェネレーターのコードパス、 yield 演算子、新しい開始値を Generator.prototype.next() に渡すことで指定することができる機能により、ジェネレーターは大きな力と制御を提供します。

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

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

ジェネレーター関数が定義されると、ご覧のようにイテレーターを構築するために使用されます。

let 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 (ECMA-262)
Yield の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
yieldChrome 完全対応 39Edge 完全対応 12Firefox 完全対応 26
補足
完全対応 26
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
補足 Starting with Firefox 29, an IteratorResult object returned for completed generator function.
IE 未対応 なしOpera 完全対応 26Safari 完全対応 10WebView Android 完全対応 39Chrome Android 完全対応 39Firefox Android 完全対応 26
補足
完全対応 26
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
補足 Starting with Firefox 29, an IteratorResult object returned for completed generator function.
Opera Android 完全対応 26Safari 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.

凡例

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

関連情報