2013-05-03 12 views
9

JavaScriptのモジュールパターンでは、「即座に呼び出される関数式」(自己実行型の匿名関数とも呼ばれます)は、オブジェクトを返す自己実行関数として使用されます。 自己実行機能はどのようにしてプライベート変数を隠し、返されたオブジェクトのみを公開することができます。なぜこれは通常のJavaScript関数では起こりませんか? 次のミニモジュールでは、enclosing()()を使用しないで同じカプセル化の概念を達成できないのはなぜですか?Javascriptモジュールパターンで自己実行する匿名関数が使用されるのはなぜですか?

var Module = (function() { 
    var privateVariable = "foo", 
     privateMethod = function() { 
      alert('private method'); 
     }; 

    return { 
     PublicMethod: function() { 
      alert(privateVariable); 
      privateMethod(); 
     } 
    }; 
})(); 
+0

あなたに必要な理解の50%を与えるべきで割り当てられているものを中心に、あなたの心を取得します。残りの50%は[クロージャ](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures)を理解したものです。それでも問題が解決しない場合は、Douglas Crockfordの「[JavaScriptのプライベートメンバー](http://javascript.crockford.com/private.html)」を読んでください。 –

答えて

9

どのように自己実行機能は、プライベート変数を隠すだけ返されたオブジェクトを公開することができます。なぜこれは通常のJavaScript関数では起こりませんか?

通常のJavaScript機能では起こります。

function MakeModule() { 
    var privateVariable = "foo", 
     privateMethod = function() { 
      alert('private method'); 
     }; 

    return { 
     PublicMethod: function() { 
      alert(privateVariable); 
      privateMethod(); 
     } 
    }; 
} 

var Module = MakeModule(); 

でも問題ありません。

唯一の違いは、匿名関数はグローバル変数を1つ少なくし、ガベージコレクションを可能にし、MakeModuleは明示的にdeletedを作成しない限り収集できないことです。

+0

IIFEは返されたもので参照されたものを含むクロージャを形成する場合、実際にGCFできますか? –

+1

@DaggNabbit、はい。 'arguments'オブジェクトが使われていない限り。関数オブジェクトは呼び出しのオペランドとして作成されるので、呼び出しが完了すると直ちにその関数への参照は使用されなくなり、呼び出しから残っている唯一のものは、内部関数をエスケープして変数を格納する実行コンテキストです。 –

2

秘密は、クロージャのためです。 "var privateVariable"は "PublicMethod"によって閉じられているので、その関数だけがその変数にアクセスできます。

"Immediately-Invoked Function Expressions"だけでなく、通常の関数呼び出しでも発生します。後で外部関数を呼び出すときにモジュールを定義するのではなく、モジュールを定義するときにすぐにクロージャを作成する方法です。

また、ダグラス・クロックフォード自身からこの記事を参照してください。http://javascript.crockford.com/private.html

+0

「すぐにクロージャを作成する」というアイデアは私の疑問に最もよく答えます。 – Brendan

0

あなたが名前の関数を経由して匿名関数を定義することができます。

例:

//factorial 
(function(n){ 
    var self = function(n){ 
     //call self 
     return n > 0 ? (self(n-1) * n) : 1; 
    } 
    return self; 
})() 
関連する問題