4

これまでのところ、この関数を使用する利点を学びました (ラッピングですか?)

したがって、ほとんど名前空間のように機能します。次があるとします。

( function() {

    function foo(){
        alert(true);
    }

    foo(); //alerts true

})();


( function() {

    function foo(){ //the same title of the function as above
        alert("another call of foo");
    }

    foo(); //alerts, ok.

})();

また、次のようにパブリック変数にアクセスできることにも気付きました。

var __foo__ = 'bar';

( function() {

    alert(__foo__); //alerts bar

})();

このアプローチに関していくつか質問があります

私が試したこと:

  1. チュートリアルに Bing を使用します (見つけましたが、それらの多くは私の質問に答えてくれません)
  2. オブジェクトをボディに渡して遊ぶ
  3. ここで答えを見つけてください

でも、私はまだ頭を壁にぶつけています。

質問は次のとおりです。

人々がオブジェクトをパラメータとして渡すのを見てきましたが、いつそれが理にかなっているのですか? たとえば、それはどういう意味ですか?

  1. ( function(window) {
    
    
    })(document);
    
  2. 私はJquery UI Libでこのようなものを見ました

    ( function($) {
        //some code of widget goes here
    })(Jquery);
    

これにより、内部コードが関数の外から見えるようになりますよね? (よくわかりません) これは、オブジェクトを呼び出すだけで (「モーダル」ウィジェットがあるとします)、オブジェクトにアクセスできるためです。

お気に入り:

$(function(){

    $("#some_div").modal(); //here it's object the we got from the function
});

2 番目の質問は、どのように機能するかです。

4

6 に答える 6

2

人々がオブジェクトをパラメータとして渡すのを見てきましたが、いつそれが理にかなっているのですか? たとえば、それはどういう意味ですか?

( function(window) {
 })(document);

言語は、すぐに呼び出される関数へのパラメーターを、他の関数へのパラメーターとは異なる方法で処理しません。

入力の関数本体にローカル名が必要な場合はいつでも、パラメーターを使用するのが理にかなっています。この場合、混乱する可能性が高いため、少し混乱windowdocumentます。


( function($) {
     //some code of widget goes here
})(Jquery);

これにより、内部コードが関数の外から見えるようになりますよね? (よくわかりません)なぜなら、これは単に呼び出すだけでオブジェクトにアクセスできるからです (「モーダル」ウィジェットがあるとします)。

いいえ。それ自体では、ウィジェットの外部にコードが表示されるわけではありません。これは、グローバル変数に新しいローカル名を提供する単なるパラメーター定義です。

内部コードを外部に見えるようにするのは、次のように外部オブジェクトにアタッチすることです

$.exportedProperty = localVariable;

これは、jQuery コードの一般的な規則です。

于 2012-08-15T19:07:07.147 に答える
1

最初の質問では、ウィンドウとドキュメントを見たとは思いませんが、次のようなものです。

(function(doc) {
    var fubar = doc.getElementById("fubar"); // === document.getElementById("fubar")
})(document);

任意の関数のような引数を持つ自己呼び出し関数 (またはクロージャー) があります。

var b = function(str) { alert(str); }
b('hi there') //alert('hi there');

上記のコードでも同じですが、作成したメソッドをすぐに呼び出しているだけです。

あなたが持っている他のコード:

( function($) {
    //some code of widget goes here
})(Jquery);

$jQueryオブジェクトを参照するためにメソッド内の変数を予約することです。これは、より多くのフレームワークがある場合、または$オブジェクトを別のものに置き換えた場合に非常に便利$です.コード内で置き換えないでください)。

コード:

$(function(){
    $("#some_div").modal(); //here it's object the we got from the function
});

jQuery を呼び出しており、そのショートカットは$(document).readyです

メソッドを呼び出します:

function(){
    $("#some_div").modal(); //here it's object the we got from the function
}

DOM の準備ができ次第

于 2012-08-15T19:08:21.000 に答える
1

以下に示すように、ウィンドウとドキュメント オブジェクトを渡す目的は主に 2 つあります。

(function(window, document){
   // code
}(window, document);
  1. JavaScript は、グローバル変数よりも高速にローカル変数にアクセスできます。このパターンは、事実上、グローバルではなく名前windowとローカル変数を作成するため、スクリプトがわずかに高速になります。document
  2. これらの名前をローカル変数にすることには、もう 1 つの利点があります。したがって、上記のスクリプトを縮小すると、ローカル バージョンのwindowは に名前が変更されadocumentに名前が変更される可能性があるためb、縮小されたスクリプトは小さくなります。それらをグローバルとして参照する場合、これらの名前変更はスクリプトを壊してしまうため不可能です。

詳細については、これらの素晴らしいビデオをチェックしてください

  1. http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/
  2. http://paulirish.com/2011/11-more-things-i-learned-from-the-jquery-source/
于 2012-08-15T19:46:00.997 に答える
1

このパターンはクロージャーと呼ばれます。モジュールまたは関数が次の場合に使用するのは理にかなっています。

  1. グローバルスコープの変数の汚染を避けたい
  2. グローバルスコープの変数の使用を避け、それらを汚染する他のコードを避けたい

それぞれの例として、まず次のパターンを取り上げます。

(function(window) {
    // ...
})(window);

クロージャ内のすべてが、ローカル変数であるかのようにwindowを使用できます。

次に、JQuery シンボルを使用して同じパターンを取ります。

(function($) {
    // ...
})($);

$ のようなシンボル/名前空間に依存するコードがある場合、別のモジュールがそれを再割り当てすると、コードが台無しになる可能性があります。このパターンを使用すると、シンボルをクロージャーに挿入できるため、これを回避できます。

于 2012-08-15T19:10:10.470 に答える
1

そのラッピング関数に引数を渡すときはいつでも、アプリケーションに存在する可能性のある他のライブラリやグローバル変数を台無しにしないようにするためです。

たとえば、jQuery がそれ自体を呼び出すためのシンボルとして使用することを知っているかもしれませんし、別のライブラリもあるかもしれませんが、それはitselt を呼び出すため$にも使用されます。この状況では、ライブラリを参照するのに問題があるかもしれません。$したがって、次のように解決します。

(function($){
// here you're accessing jQuery's functions
$('#anything').css('color','red');
})(jQuery);

(function($){
    // and in here you would be accessing the other library
    $.('#anything').method();
})(otherLibrary);

これは、jQuery やその他の種類のライブラリ プラグインを作成する場合に特に便利です。

于 2012-08-15T19:11:04.090 に答える
1

変数が関数の外で別のものとして定義されていても$、変数の代わりに関数内の変数を使用できるようにします。jQuery$

例として、jQuery と Prototype の両方を使用している場合、 を使用jQuery.noConflict()して Prototype$が引き続きグローバル名前空間でアクセスできるようにすることができますが、独自の関数内では$jQuery を参照するために使用できます。

于 2012-08-15T19:11:35.390 に答える