5

David FowlerによるこのJSコードを見ると、彼はすべての「クラス」を匿名の自己実行メソッドでラップし、jQueryとwindowで送信します。これは、$とwindowが実際にグローバルなjQueryとwinndow変数であることを確認するための方法であることがわかりました。

しかし、これは少し過保護ではありませんか?$とwindow変数を変更する他の誰かから身を守る必要があります-実際にそれを行うコードはありますか?もしそうなら、なぜですか?また、このようにすべてをラップすることには他の利点がありますか?

4

5 に答える 5

5

私が正しく覚えていれば、$を使用するjQuery以外のライブラリがいくつかあります。

于 2012-09-14T09:09:15.953 に答える
3

関数コンテキストを使用してローカル/関数スコープを作成するという概念は、すべて独自のコードを保護することです。これは、Javascriptコードが、他の複数の(おそらく未知の)スクリプトがロードされる可能性のある環境で実行されることを期待している場合に特に意味があります。

したがって、自分の前にロードされた他のJavascriptコードがwindow.$他の値を割り当てた場合(たとえば、プロトタイプフレームワークをロードする可能性があります)、jQuery固有のものにアクセスしようとすると、コードはすでにねじ込まれています。

もう一つのポイントは「a--hole」効果です。誰かが次のような行を作成します

window.undefined = true;

...
これで、すべてのチェックundefinedはほとんど失敗します。ただし、これらの変数/パラメーターを明示的に作成し、期待する値を入力することで、これらすべての問題を回避できます。

(function(win, doc, $, undef) {
}(window, window.document, jQuery));
于 2012-09-14T09:10:48.590 に答える
2

一般に、ほとんどのトップレベルのJavaScriptコードは、特定の変数を渡すかどうかに関係なく、 IIFEでラップする必要があります。これにより、で作成された変数varがグローバルスコープを汚染するのを防ぎます。

もう1つの小さな利点は、縮小化です。コードを縮小window化する場合、パラメーターとして渡すことで「ローカル変数」にすることで、縮小化機能で名前を変更できます。ただし、gzipを実行すると、この利点はなくなります。したがって、実際の勝利ではありません。

ほとんどの場合、人々はIIFEのパターンを選択してそれに固執するだけなので、彼の場合、これが彼の.jsファイルの書き込み方法であり、均一に行うことを彼は決定しました。統一された基準を持つことは、それ自体が価値があります。

明確にするために、コードは少し長い形式で書くことができます

(function () {
    var $ = jQuery;
    var window = window;

    // ...
}());
于 2012-09-14T09:09:41.123 に答える
0

匿名関数内のコードは関数スコープであるため、グローバル変数との競合を防ぎます。

すべてのjQueryプラグインが無名関数でラップされていない場合、グローバル変数が地獄になることを想像してみてください。

于 2012-09-14T09:11:02.320 に答える
0

完全性を維持するためだけです。$はプロトタイプである可能性があるため、他の誰かが$を上書きするライブラリ/変数を追加した場合、引数としてjQueryを送信するとコードが保存されます。

2番目の引数「window」については、書きたいモジュールだと思います。

于 2012-09-14T09:21:34.153 に答える