11

私はこの構造を頻繁に使用しています:

var example = (function () {
    function privateFn2 () {
       ...
    }
    function privateFn1 () {
       ...
    }
    return {
        publicMethod1: function () {...
        },
        publicMethod2: function () {...
        }
    };
}());

私が知りたいのはこれです:privateFn1がprivateFn2を呼び出す唯一の関数/メソッドである場合、次のように設定することをお勧めしますか?

明確にするために編集

var example = (function () {
    function privateFn1() {
        function privateFn2() {
        }
        ...
        privateFn2();
    }
    return {
        publicMethod1: function () {...
        },
        publicMethod2: function () {...
        }
    };
}());

もちろん、これは非常に単純化された例です。問題は、私にはたくさんのプライベート機能があるということです。そして、ネストがよく評価されているのか、それともあまり評価されていないのか疑問に思っています。おそらく好みの問題だと思いますが、アドバイスをいただければ幸いです。

ありがとう。

4

2 に答える 2

7

状況によります。さらに別のプライベート関数にのみ関連するいくつかのプライベート関数がある場合、おそらくこれは、オブジェクトまたはクラスが本来あるべき機能よりも多くの機能をパッケージ化している状況です。

以下にいくつかの質問をします。

  • これらのプライベート関数には副作用がありますか? つまり、閉じたプロパティを操作していますか? そうでない場合、これは静的に実装して個別に含めることができる一般化されたロジックですか? それとも、これらのプライベート関数は、別のクラスまたはオブジェクトに移動できるプロパティのサブセットを操作していますか?
  • プライベート関数は、より大きなアルゴリズムまたは制御関数内で使用される単純なタスク固有のヘルパー関数ですか? 配列をソートするためのフィルター関数や、その他の種類の反復コールバックなどでしょうか? もしそうなら、それらの関数を内部にネストしてメインオブジェクトの範囲外に保つ方が実際にはきれいかもしれません。他のコードでこれらの関数が必要になりますか?
  • メインのプライベート関数は何回呼び出されますか? 非常に頻繁に (ループ内またはタイマー間隔で) 呼び出される場合、内部でプライベート関数をネストすると、かなりのオーバーヘッドが発生する可能性があります。これは、プライベート関数がたまにしか呼び出されない場合は無視できるものでした。

考慮すべきトレードオフは常にあります。これらの質問について考えると、特定の状況に最適なものを決定するのに役立ちます。

于 2012-08-08T22:24:03.573 に答える
3

2番目の例は避けます。privateFn1が呼び出されるたびに、 が再定義されprivateFn2ます。なぜ一度だけやらないのですか?後で別の場所で使用する必要があるかもしれません。

ただし、本当に非表示にしたい場合はprivateFn2、より良い解決策は次のとおりです。

var privateFn1 = (function () {
    function privateFn2() {
        // ...
    }

    return function () {
        privateFn2();
        // ...
    };
})();
于 2012-08-08T21:39:39.737 に答える