違いは何ですか
var module = (function(){
return {}
})()
と
(function(context){
var module = {}
context.module = module;
})(this)
違いは何ですか
var module = (function(){
return {}
})()
と
(function(context){
var module = {}
context.module = module;
})(this)
のプロパティはthis
変数と同等ではありません。グローバルスコープ(つまり、this
参照先window
)では、それらは類似しています。ただし、たとえば、それらを実行しようとすると、動作が異なりdelete
ます。
> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted
それとは別に、両方のスニペットは、ローカル(プライベート)変数/関数などを定義できるクロージャ内にラップされた空のオブジェクトを作成します。2番目の関数では、オブジェクトもローカル変数module
に割り当てられますが、最初の関数で行うことができます1つも。
@Eric:new
演算子を使用したアプローチは、変数に関する最初のアプローチと似ています。ただし、プレーンオブジェクトを返す代わりに、その無名関数のインスタンスを作成します。カスタムプロトタイプからプロパティを継承するため、たとえばmodule.constructor
、無名関数をポイントします(ガベージコレクションはできませんが、クローンを作成するために再利用することもできます)。これの使用はお勧めしません。
一番上はモジュールパターンを明らかにしています。これにより、プライベート関数を(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)
モジュールは、実際には明らかにするモジュールパターンで定義できますが、あなたの例では単なるオブジェクトリテラルであるため、言うのは難しいです。