ジェネレータ宣言

ジェネレータは一時停止と再開の機能を持つ関数。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) // 地球