4

重複の可能性:
(function(window、document、undefined){…})(window、document)を使用するとどのような利点がありますか?

私が使用しているライブラリでは、このようなコードがますます見られます。

(function (window) {
    var Foo = function () {
    }

    window.Foo = Foo;
})(window);

これを行うために私が見た議論は、(疑似)クラスを作成するときにグローバルスコープでの作業を避けることです。しかし、私が間違っている場合は訂正してください。ウィンドウがグローバルスコープであることを常に理解していました。グローバル変数を作成するときは、とにかくウィンドウにプロパティを追加するだけだと思います...これがES5 strictで変更されない限り、

それで、基本的に、ポイントは何ですか?このように編成されたコードで私が見ることができる唯一の利点は、ウィンドウ以外の引数を渡すことによって、後日クラスの名前空間を簡単に変更したい場合です。

4

3 に答える 3

3

実際、変数宣言に使用するのを忘れた場合、strictモードは例外をスローします。varしかし、それは外部クロージャーを使用しなくても機能します。

このパターンを使用することは、外部のjavascriptの世界から身を守るためにはるかに役立ちます。たとえば、他のスクリプトがwindow.undefinedまたは他の変数を上書きする場合、そのクロージャ内の値を取得して、内部から保存してアクセスできます。

例えば

(function _myApp( win, doc, undef ) {
    // app code
}( this, this.document ));

また、 varを使用して変数を宣言する場合、または関数宣言を作成する場合、それらは常に現在のアクティベーションオブジェクト内にそれぞれLexicalEnvironmentRecordに格納されます。つまり、関数コンテキストを使用せずに、他のポイントからメソッドと変数を簡単に上書きできます。これらはすべて、現在のコンテキスト(グローバルコンテキスト)に格納されるためです。

それで:

(function _myApp( win, doc, undef ) {
    var myVar = 42;

    function myFunc() {
    }
}( this, this.document ));

(function _myModule( win, doc, undef ) {
    var myVar = 42;

    function myFunc() {
    }
}( this, this.document ));

これはクロージャコンテキストのために機能しますが、関数コンテキストなしで同じコードを使用する場合は、明らかにとを上書きmyVarしますmyFunc。これは、同じファイル内または別のロードされたスクリプト内のどこからでも発生する可能性があります。

于 2012-10-22T14:36:20.683 に答える
0

グローバル変数と同じくらい邪悪ですが、少なくとも1つ必要です。そうしないと、スクリプトにアクセスする方法がありません。提供したコードは、その1つのグローバル変数を作成する1つの方法です。私はこの方法を好みます:

window.Foo = (function () {
    var func = function () {
        //  ...
    };

    return {
        func: func
    };
})();
于 2012-10-22T14:36:35.237 に答える
0

その通りですが、違いは、関数内のコードが自動init関数のように機能することです。

(function (window) {
    var Foo = function () {
    }

    var Bar = 69; // not in global scope

    window.Foo = Foo; // in global scope
})(window);

とは対照的に

var Foo = function () { // in global scope
}

var Bar = 69; // in global scope

var Foo = function () { // in global scope
}

function init () {
    var Bar = 69; // not in global scope
}
init();
于 2012-10-22T14:37:16.487 に答える