ジェネレータは一時停止と再開の機能を持つ関数。function*
というようにアスタリスクを付けて定義する。
通常の関数はreturnで戻り値を一回取得するとそこで関数は終了するが、ジェネレータなら終了せずに何度も自由に戻り値を得られるイメージ。
まず、通常の関数実行のようにジェネレータ()
とするとイテレータというオブジェクトが戻ってくる。この段階では関数本体は実行されない。
つぎに、イテレータ.next()
とすると本体の処理がyeild
キーワードのある部分まで進み、いったんそこでの戻り値を取得でき、関数は一時停止となる。以降はイテレータ.next()
を繰り返す都度、再開と一時停止を繰り返す仕組み。
// 関数宣言のように、定義より前の行で呼び出し可能
ジェネレータ宣言()
// ジェネレータ宣言
function* ジェネレータ宣言(引数) {
console.log('はじまり')
// yieldで一時停止し、戻り値を指定できる
yield '水星'
yield '金星'
console.log('ハビタブルゾーン')
yield '地球'
yield '火星'
}
// 1. イテレータオブジェクトを生成。この段階ではまだ関数内は実行されない。
let イテレータ = ジェネレータ宣言()
// ジェネレータではnew演算子は使えない。
// イテレータ = new ジェネレータ宣言() // TypeError
// 2. イテレータのnextメソッドで、次のyieldキーワード部分まで処理が進む。
let 戻り値 = イテレータ.next() // はじまり
// 戻り値オブジェクトのvalueプロパティに、yieldで指定のオブジェクトが格納されている。
console.log(戻り値.value) // 水星
// nextメソッドを実行するたびに「処理を再開して次のyieldで一時停止」を繰り返す。
イテレータ.next()
戻り値 = イテレータ.next() // ハビタブルゾーン
console.log(戻り値.value) // 地球