9

JavaScript のモジュール パターンでは、オブジェクトを返す自己実行関数として "即時呼び出し関数式" (自己実行匿名関数とも呼ばれます) が使用されます。自己実行関数がプライベート変数を非表示にして、返されたオブジェクトのみを公開するにはどうすればよいですか。なぜこれは通常の JavaScript 関数では起こらないのですか? では、次のミニモジュールでは、()() を囲むことなく同じカプセル化の概念を実現できないのはなぜでしょうか?

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

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

3 に答える 3

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 を指定しない限りコレクションできないことです。

于 2013-05-03T22:45:03.767 に答える
2

プライベート性は閉鎖によるものです。「var privateVariable」は「PublicMethod」によって閉じられているため、その関数だけが変数にアクセスできます。これは、クロージャーに変数があるためです。他のものから参照することはできず、「プライベート」です

これは「即時呼び出し関数式」だけでなく、通常の関数呼び出しでも発生します。これは、後で外部関数を呼び出すときにクロージャーを作成するのではなく、モジュールを定義するときにすぐにクロージャーを作成する方法にすぎません。

Douglas Crockford 自身の次の投稿も参照してください: http://javascript.crockford.com/private.html

于 2013-05-03T22:46:00.577 に答える