構文
[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* 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; }