[解決済み】JavaScriptの "function*"とは何ですか?
質問
で これ のページで、新しいJavaScriptの関数型を発見しました。
// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13
function* fibonacci() { // !!! this is the interesting line !!!
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
私はすでに知っている
何
yield
,
let
と
[?,?]=[?,?]
する
が、何のためにあるのかわからない。
function*
は、そのような意味です。それは何でしょうか?
追伸:わざわざGoogleを試さなくても、それは ありえない で検索すると、アスタリスクのある表現( プレースホルダーとして使用される ).
解決方法は?
それは ジェネレータ 関数を使用します。
ジェネレータは、一旦終了して後で再入力することができる関数です。そのコンテキスト(変数バインディング)は再入力時に保存されます。
ジェネレータ関数を呼び出しても、その本体がすぐに実行されるわけではなく、関数のイテレータオブジェクトが代わりに返されます。イテレータの
next()
メソッドが呼ばれると、ジェネレータ関数の本体は、最初のyield
この式は、イテレータから返される値を指定します。yield*
他のジェネレータ関数に委ねる。
歴史的なメモ
の構文として提案されたものです。
EcmaScript.next
.
MozillaのDave Herman氏は、以下のような講演を行いました。 EcmaScript.next . で 30:15 ジェネレーターについて話しています。
先に、委員会の舵取りをするために、Mozillaがどのように言語変更案を実験的に実装しているかを説明しています。Dave は Mozilla の CTO (だと思う) であり、オリジナルの JavaScript を設計した Brendan Eich と密接に連携しています。
EcmaScript working groupのwikiに詳細が掲載されています。 http://wiki.ecmascript.org/doku.php?id=harmony:generators
ワーキンググループ (TC-39) は EcmaScript.next が何らかのジェネレータ・イテレータの提案を持つべきであるということに大筋で合意していますが、これは最終的なものではありません。
次のバージョンの言語で変更なく表示されることを当てにしてはいけませんし、変更されない場合でも、おそらくしばらくは他のブラウザで広く表示されることはないでしょう。
<ブロッククオート概要
ファーストクラスのコルーチンは、中断された実行コンテキスト(すなわち、関数の活性化)をカプセル化するオブジェクトとして表現される。先行技術。Python、Icon、Lua、Scheme、Smalltalk。
事例紹介
フィボナッチ数の「無限」列(2付近の挙動はともかくとして 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
ジェネレータはループで反復することができる。
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
ジェネレータはイテレータです。
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
関連
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】module.exports "モジュールが定義されていません"
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み] イールドリターン」の正しい使い方