2

次のようなコードがたくさんあります。

var myApp ={};
(function() {
    console.log("Hello");
    this.var1 = "mark";     //"this" is global, because it runs immediately on load.  Caller is global
    myApp.sayGoodbye = function() {
        console.log("Goodbye");
    };
})();

これにより、匿名関数がすぐに実行されます。しかし、コードをインラインに置くことと比較して、これにはどのような利点があるのでしょうか?

var myApp ={};
console.log("Hello");
var1 = "mark";     
myApp.sayGoodbye = function() {
    console.log("Goodbye");
};

どうやら関数のスコープに関係しているようですが、関数は匿名でウィンドウによって呼び出されるため、スコープ(つまりthis)はグローバルですよね?

4

2 に答える 2

4

通常、次のようになります。

        var myApp ={};
        (function() {
            console.log("Hello");
            var var1 = "mark";  
            myApp.sayGoodbye = function() {
                console.log("Goodbye");
            };
        })();

主な違いはvar1、グローバル名前空間が乱雑にならないことです。この呼び出しの後、var1は以前と同じです (通常は未定義)。

var1クロージャーで定義された関数からのみアクセスできるため、「プライベート」と呼ばれます。

競合の考えられる原因を回避することは別として、役に立たないときにグローバル変数を保持しない方がクリーンです。

ここでは、ローカル変数はありませんが、グローバル変数は として定義されていthis.var1ます。これはおそらくバグであるか、コードの別の場所に原因があります。

于 2013-01-14T11:58:56.023 に答える
3

1 つの理由: コードを無名関数でラップすると、公開 API を、モジュールの内部でのみ使用される非公開関数および変数と区別するモジュールを作成できます。これにより、グローバル名前空間の汚染が回避されます。

var myApp ={};
(function() {
    console.log("Hello");
    this.var1 = "mark";

    function helper() {/*Some code here*/;}

    myApp.sayGoodbye = function() {
        helper()
        console.log("Goodbye");
    };
})();

私は言うことができます:

var myApp ={};
console.log("Hello");
var var1 = "mark";

function helper() {/*Some code here*/;}

myApp.sayGoodbye = function() {
    helper()
    console.log("Goodbye");
};

しかし、グローバルスコープには、helperあなたのモジュールを使用している人には何の役にも立たない関数が呼び出され、他のモジュールとの名前の競合が発生する可能性があります。

helperあるいは、myApp のメソッドとして含めることもできます。

var myApp ={};
console.log("Hello");
var var1 = "mark";

myApp.helper = function() {/*Some code here*/;}

myApp.sayGoodbye = function() {
    this.helper()
    console.log("Goodbye");
};

ただし、ユーザーが を直接呼び出さないようにしたいhelper場合があります。その場合、これはうまくいきません。

于 2013-01-14T12:29:27.203 に答える