ECMAScript 6 ドラフト仕様は、すでに最新の JavaScript デベロッパーに多くの喜びをもたらしています。新しいコレクション クラスと for..of
反復ループについては、前回の記事で説明しました。この記事では、for..of
ループと密接に関連するジェネレータ関数について説明します。
発電機を使用する理由と方法について説明している優れた資料がすでに多数あります。簡単に説明すると、ジェネレータはイテレータを作成する特別な関数であり、イテレータは next()
メソッドを持つオブジェクトで、このメソッドを呼び出して値を取得できます。ジェネレータ関数内で、キーワード yield
は next()
の値を提供します。yield
を使用すると、ジェネレータ関数の実行が停止され、next()
が再び呼び出されるまでの状態が保持されます。この時点でコードが再開され、別の値が yield
されるまで(またはジェネレータ関数が終了するまで)続行されます。ジェネレータ関数には、フィボナッチ数列の数値を反復処理するなど、いくつかの標準的なユースケースがあります。
基本を理解したところで、JavaScript のサンプルで、ジェネレータを使用する際の注意点について詳しく見てみましょう。コード全体にコメントが記述されています。コードを読む前に、ライブ バージョンで試すことができます。
このコードから得られる主なポイントは何でしょうか。
まず、ジェネレータを作成すると、独自の状態を持つ一意のイテレータが生成されます。ジェネレータのコンストラクタにパラメータを渡して、動作を制御できます。
2 つ目は、イテレータの next()
メソッドを呼び出すときにパラメータを渡す方法です。この値は、前のイテレータ呼び出しの yield
ステートメントの左側にあるものに割り当てられます。これは、イテレータの出力を変更するのに最適な方法です。ここでは、生成される単語が大文字かどうかを制御するために使用しています。生成される最初の値に影響を与える場合は、ジェネレータのコンストラクタにパラメータを渡します。
最後に、ジェネレータは有限または無限のイテレータを生成できます。無限イテレータを使用する場合は、yield
された値に基づくなんらかの終端条件があることを確認してください。特に、反復処理に for..of
を使用する場合は、誤って無限ループを記述することが非常に簡単です。next()
の呼び出しで有限イテレータを使用している場合、返されたオブジェクトの .done
プロパティは、イテレーションが完了したかどうかを示します。
このサンプルと、ウェブで入手できる他のリソースを参考にして、生成ツールを独自のコードで使用する方法について考えていただければ幸いです。Firefox 31 以降と Chrome 39 以降のバージョンでは、ジェネレータがネイティブにサポートされています。Regenerator プロジェクトは、他のブラウザのジェネレータもサポートしています。また、Traceur を使用する方法もあります。
この記事のレビューに協力してくれた Erik Arvidsson に感謝します。