yield キーワードはジェネレーター関数の一時停止と再開で利用します。(function* または legacy generator function)。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
[rv] = yield [expression];
expression- iterator protocol 経由で取得したジェネレーター関数を定義します。省略した場合、
undefinedが返ります。 rv-
ジェネレーターの実行を再開する
next()メソッドに渡したオプションの値が返ります。
説明
yield キーワードは、ジェネレーター関数の実行を一時停止し、ジェネレーターの呼び出し元に yield キーワードに続く値を戻します。これは、return キーワードのジェネレーター版と考えることができます。
yield キーワードは value と done の 2 つの属性を持つ IteratorResult オブジェクトを返します。value 属性には、yield 式を評価した結果であり、 done 属性には false が代入されています。これはジェネレーター関数が完全には終了していないことを示しています。
yield 式によって実行が停止されると、ジェネレーターの next() メソッドが呼び出されるまで、ジェネレーターのコード実行は一時停止します。ジェネレーターの next() メソッドが呼ばれるたびに、ジェネレーターの実行が再開され、次のうちのいずれかに達するまで実行されます:
- ジェネレーターを再び停止して、ジェネレーターの新しい値を返す
yield。再度next()が呼ばれるとyieldの直後から実行が再開されます。 - ジェネレーターから例外をスローするために使用される
throw。完全にジェネレーターの実行を停止し、例外がスローされたときに通常そうであるように呼び出し元で実行が再開されます。 - ジェネレーター関数の終わり: この場合、ジェネレーターの実行は終了し、
valueにundefinedが、doneにtrueが代入されたIteratorResultオブジェクトが呼び出し元に返ります。 returnステートメント。この場合ジェネレーターの実行は終了し、valueがreturnステートメントで指定した値でdoneがtrueのIteratorResultオブジェクトが呼び出し元に戻されます。
ジェネレーターの 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 の定義 |
ドラフト |
ブラウザー実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield | Chrome 完全対応 39 | Edge 完全対応 12 | Firefox
完全対応
26
| IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 10 | WebView Android 完全対応 39 | Chrome Android 完全対応 39 | Firefox Android
完全対応
26
| Opera Android 完全対応 あり | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 4.0 | nodejs
完全対応
4.0.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式の解析が最新の ES2015 仕様に準拠するように更新されました(バグ 981599):yieldキーワードの後の式はオプションで、省略してもSyntaxErrorをスローしなくなりました:function* countAppleSales() { yield; }