4

自己呼び出し関数を記述する次の方法を見てきました。

(function (app) {
    app.foo = {
        bar: function(){}
    };
}(App));

Appグローバル オブジェクトはどこにありますか。

App関数にパラメーターとして渡す必要があるのはなぜでしょうか。これを使用しないのはなぜですか:

(function () {
    App.foo = {
        bar: function(){}
    };
}());

最初の方法を使用する利点は 1 つだけです。何らかの理由でAppオブジェクトの名前を変更した場合、括弧内のパラメーターの名前を簡単に変更でき、コードはそのまま機能します。Appしかし、2 番目の方法の場合、使用するすべての場所でおそらく名前を変更する必要があります。

他に違いはありますか?

4

4 に答える 4

9

これは、識別子に関して、関数の内容がappグローバル (または親) スコープに依存しないことを意味します。

これが行われるシナリオの 1 つは、たとえば、jQuery で、jQuery オブジェクトが呼び出されると想定したくない$場合 (たとえば、非競合モードがオンの場合) ですが、次の方法で呼び出したい場合です。その名前。このような無名関数 (つまり ) を介して渡すと、親/グローバル スコープ内(function($) {})(jQuery)の名前の外部の意味に干渉しない、ローカル スコープのエイリアスを生成できます。$

于 2013-01-18T13:49:36.467 に答える
2

他の回答は、ローカルスコープのコピーを持つ利点を説明しています。他にもいくつかの利点があります。

  • マイクロ最適化として、スコープ ルックアップを減らします (グローバル var よりもローカル var を見つける方がコストがかかりません)。
  • すべてのパラメータがvarsという名前の1文字に縮小されるため、縮小プロセスに役立ちます。
  • 疑似依存関係管理手法を提供します...あなたの例では、コードが依存していることがわかりますApp
于 2013-01-18T14:14:00.560 に答える
1

また、これを使用してグローバル変数をローカルで再定義し、期待どおりの内容が確実に含まれるようにすることもできます。

(function($, undefined) { ... })(jQuery);

undefined予想される未定義の場所はどこですか。参照: undefined を渡す目的は何ですか?

他のほとんどの用途は、他の回答で十分にカバーされています。

于 2013-03-21T10:23:00.397 に答える
1

たとえば、多くのライブラリでは、メイン関数 (JQuery など) のショートカットとして "$" 文字を使用しています。これは便利ですが、複数のライブラリを使用するとクラッシュする可能性があります。したがって、次のように渡すことができますJQuery

(function($) {
    // Code
    var nav = $('#nav');
    // More code
})(JQuery);

そうすれば、便利なショートカットを引き続き使用できますが、衝突を回避することもできます (「$」ショートカットを使用しないようにライブラリを構成している場合)。

于 2013-01-18T13:53:06.513 に答える