読者です 読者をやめる 読者になる 読者になる

Browser

Microsoft Edge(Project Spartan, Internet Explorer) 、ブラウザ周辺、Web フロントエンド開発、UI、など

Microsoft Edge まとめページ

Microsoft Edge の機能を調べてみた - Generator 編

Microsoft Edge の JavaScript で関数内で順に処理する yield を実装した Generator が実装されました。
関数名の前に * を付けると yield を使用することができます。

現状、Edge でこの機能をそのまま使うことができません。
アドレスバー about:flags 入力し、「開発者向け設定」ページの「試験的な JavaScript 機能を有効にする」チェックを入れて Edge を再起動してください。
また、今回のサンプルは頭の悪い Generator の使い方をしているのでもうちょっと工夫した方がよさそうです。

 

サンプル1

Generator 内の複数の yield 書いています
この Generator の next() メソッドを使うことで yield を上から順に処理します。
next() は yield が返す value と yield の終了を伝える done の値を持っています。
done が true を返すと終了となります。

 

 

サンプル2

サンプル1 動作は同じ。
done を調べているので undefined は表示されません

 

サンプル3

Generator を使って1文字ずつ文字を表示していきます。
表示する文字が固定されているため、この処理なら通常の関数で作成可能です。

 

サンプル4

Generator 内の yield から別の Generator を呼び出すことができます。
最初の Generator の next() メソッドですべて追っていけるので便利。
done の扱いが変わるため違う方法を考える必要があります。


気になったこと

Q.関数名に * を付けると Generator になりますが、通常の関数と同じ名前がある場合はどうなるか?

A.試したところ通常の関数のように後に設定したものが勝ちます。

function a(){}; function *a(){}; と書くと a() は Generator 関数、
function *a(){}; function a(){}; と書くと a() は通常の関数となるようです。


まとめ

あまり良い説明にはなっていないような気がしますが、繰り返しの処理を束ねる際に便利そうです。


また、今回使用していませんが next() の他に return() と throw() のメソッドがあります。
return() は値を渡して関数を終了し、throw() は関数内の catch を呼び出します。
自分の環境ですと return() は動作しませんでした。

スポンサーリンク