1. ホーム
  2. javascript

[解決済み] このJavaScriptのパターンは何と呼ばれ、なぜ使われるのでしょうか?

2022-12-04 01:29:28

質問

勉強中です。 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;
};

最初のバージョンを比較すると 通常 のバリエーションと比較すると、最初のものはその点で異なっているようです。

  1. 自己実行関数の結果を代入しています。
  2. この関数内でローカル変数を定義する。
  3. この関数は 実際の 関数は、ローカル変数を使用するロジックを含んでいます。

主な違いは、最初のバリエーションではバーが初期化時に一度だけ割り当てられるのに対して、2番目のバリエーションでは呼び出されるたびにこの一時的な変数が作成されることです。

これが使用される理由についての私の最善の推測は、bar のインスタンスの数を制限し (1つだけ存在する)、メモリ管理のオーバーヘッドを節約することです。

私の質問です。

  1. この仮定は正しいですか?
  2. このパターンに名称はありますか?
  3. なぜこれが使われるのでしょうか?

どのように解決するのですか?

あなたの仮定はほぼ正しいです。まずはそれを見直してみましょう。

  1. 自己実行型関数の戻り値を代入している

これは 即座に呼び出される関数式 または IIFE

  1. この関数内でローカル変数を定義しています

これは、JavaScriptでプライベートなオブジェクトフィールドを持つ方法です。 private キーワードやそれ以外の機能を提供しないためです。

  1. ローカル変数を利用するロジックを含む実際の関数を返します。

繰り返しになりますが、要点は、このローカル変数が プライベート .

このパターンの名前はあるのでしょうか?

AFAIKでは、このパターンを モジュールパターン . 引用しています。

Moduleパターンはクロージャを使用して、プライバシー、状態、および組織をカプセル化します。パブリックとプライベートのメソッドと変数を組み合わせてラップする方法を提供し、グローバルスコープに漏れて他の開発者のインターフェースと誤って衝突しないように断片を保護します。このパターンでは、パブリックAPIのみが返され、クロージャ内の他のすべてはプライベートに保たれます。

これら 2 つの例を比較すると、最初のものが使用される理由についての私の最良の推測は次のとおりです。

  1. Singleton デザイン パターンを実装している。
  2. 最初の例を使って、特定の型のオブジェクトを作成する方法を制御することができます。このポイントに近いものとして 静的ファクトリーメソッド であり、Effective Javaで説明されています。
  3. それは 効率的 は、毎回同じオブジェクトの状態が必要な場合、効率的です。

しかし、もしあなたが毎回バニラオブジェクトを必要とするだけであれば、このパターンはおそらく何の価値ももたらさないでしょう。