1

違いは何ですか

var module = (function(){
    return {} 
})()

(function(context){
    var module = {}
    context.module = module;
})(this)
4

2 に答える 2

3

のプロパティはthis変数と同等ではありません。グローバルスコープ(つまり、this参照先window)では、それらは類似しています。ただし、たとえば、それらを実行しようとすると、動作が異なりdeleteます。

> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted

それとは別に、両方のスニペットは、ローカル(プライベート)変数/関数などを定義できるクロージャ内にラップされた空のオブジェクトを作成します。2番目の関数では、オブジェクトもローカル変数moduleに割り当てられますが、最初の関数で行うことができます1つも。


@Eric:new演算子を使用したアプローチは、変数に関する最初のアプローチと似ています。ただし、プレーンオブジェクトを返す代わりに、その無名関数のインスタンスを作成します。カスタムプロトタイプからプロパティを継承するため、たとえばmodule.constructor、無名関数をポイントします(ガベージコレクションはできませんが、クローンを作成するために再利用することもできます)。これの使用はお勧めしません。

于 2012-08-26T17:48:22.380 に答える
0

一番上はモジュールパターンを明らかにしています。これにより、プライベート関数を(javascriptで可能な限り)定義し、return呼び出しを介してパブリックにする関数を選択できます。

var module = (function(){ 
    function foo() {}; // Public, since it's returned

    function bar() {}; // Private, since it is not returned

    return {
        foo: foo
    } 
})();

一番下のものは、私が知る限り、オブジェクトリテラルを別のオブジェクトの名前空間に割り当てるだけです。それはおそらく単一のパターンの始まりです。

(function(context){
    var module = {};
    context.module = module;
}(this)

モジュールは、実際には明らかにするモジュールパターンで定義できますが、あなたの例では単なるオブジェクトリテラルであるため、言うのは難しいです。

于 2012-08-26T17:48:43.023 に答える