[解決済み] このJavaScriptのパターンは何と呼ばれ、なぜ使われるのでしょうか?
質問
勉強中です。 THREE.js を勉強していて、関数がこのように定義されているパターンがあることに気づきました。
var foo = ( function () {
var bar = new Bar();
return function ( ) {
//actual logic using bar from above.
//return result;
};
}());
(例:レイキャストメソッド参照 ここで ).
は 通常 のバリエーションは次のようなものです。
var foo = function () {
var bar = new Bar();
//actual logic.
//return result;
};
最初のバージョンを比較すると 通常 のバリエーションと比較すると、最初のものはその点で異なっているようです。
- 自己実行関数の結果を代入しています。
- この関数内でローカル変数を定義する。
- この関数は 実際の 関数は、ローカル変数を使用するロジックを含んでいます。
主な違いは、最初のバリエーションではバーが初期化時に一度だけ割り当てられるのに対して、2番目のバリエーションでは呼び出されるたびにこの一時的な変数が作成されることです。
これが使用される理由についての私の最善の推測は、bar のインスタンスの数を制限し (1つだけ存在する)、メモリ管理のオーバーヘッドを節約することです。
私の質問です。
- この仮定は正しいですか?
- このパターンに名称はありますか?
- なぜこれが使われるのでしょうか?
どのように解決するのですか?
あなたの仮定はほぼ正しいです。まずはそれを見直してみましょう。
- 自己実行型関数の戻り値を代入している
これは 即座に呼び出される関数式 または IIFE
- この関数内でローカル変数を定義しています
これは、JavaScriptでプライベートなオブジェクトフィールドを持つ方法です。
private
キーワードやそれ以外の機能を提供しないためです。
- ローカル変数を利用するロジックを含む実際の関数を返します。
繰り返しになりますが、要点は、このローカル変数が プライベート .
このパターンの名前はあるのでしょうか?
AFAIKでは、このパターンを モジュールパターン . 引用しています。
Moduleパターンはクロージャを使用して、プライバシー、状態、および組織をカプセル化します。パブリックとプライベートのメソッドと変数を組み合わせてラップする方法を提供し、グローバルスコープに漏れて他の開発者のインターフェースと誤って衝突しないように断片を保護します。このパターンでは、パブリックAPIのみが返され、クロージャ内の他のすべてはプライベートに保たれます。
これら 2 つの例を比較すると、最初のものが使用される理由についての私の最良の推測は次のとおりです。
- Singleton デザイン パターンを実装している。
- 最初の例を使って、特定の型のオブジェクトを作成する方法を制御することができます。このポイントに近いものとして 静的ファクトリーメソッド であり、Effective Javaで説明されています。
- それは 効率的 は、毎回同じオブジェクトの状態が必要な場合、効率的です。
しかし、もしあなたが毎回バニラオブジェクトを必要とするだけであれば、このパターンはおそらく何の価値ももたらさないでしょう。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] JavaScriptの変数のスコープとは何ですか?
-
[解決済み] JavaScriptの(function() { } )()構文とは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScript版sleep()とは?)
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] ECMAScriptとは?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]