ジェネレータ関数を作るfunction*()記法を使って、オレオレ・イテレータを作ることが出来ます。
- 基本的に同じルールで進行するが時偶変なパラメータが発生する
- 任意のフラグが立った際、強制終了したい
……といった、有りがちなケースで使うと効果的です
実際のところ
イテレータなので、next()を呼び出さない限り次には行きません。
たとえば3までの数値を1毎に返したいだけの場合、以下のようにします。
……まぁ、この程度なら配列で済みますが。
function* idMaker(i){ while (i < 3) yield i++; } var gen = idMaker(0); console.log(gen.next().value); console.log(gen.next().value); // 0 // 1
yieldを使う事で次の値を指定できるわけですが、
ここでyield*を使うと……なんと別のジェネレータ関数に飛ぶ事も可能です。
よくあるfizzbuzzだとこんな感じに実装できます。
var gen = fizzbuzzChecker(1); for (i = 0; i < 16; i++) console.log(gen.next()); function* fizzbuzzChecker(i){ while(true) { if ((i % 15) == 0) { yield* fizzbuzz(); i++ } if ((i % 3) == 0) { yield* fizz(); i++} if ((i % 5) == 0) { yield* buzz(); i++} yield i++; } } function* fizzbuzz() { yield 'fizzbuzz'; } function* fizz() { yield 'fizz'; } function* buzz() { yield 'buzz'; }