12

私はこのコードを見ました(明らかにそれはjQueryにあり、変更が加えられています)

(function(window,undefined){
    var jQuery=(function(){
        var jQuery=something;
        jQuery.xxx=xxx;
        //...
        return jQuery;
    })();
    //...
    window.jQuery=window.$=jQuery;
})(window);

インライン関数呼び出しでコードをラップすることで変数スコープを明確に定義できることは理解していますが、

  1. 直接使用する代わりにパラメータを渡しwindowて、
  2. undefined未定義のパラメータによるインスタンスの取得、および
  3. jQuery別のインライン関数呼び出しの戻り値によって定義します。誰かが少し説明できますか?

書き込み#3をより明確に編集します。

私が理解しているのは、コードjQueryが別の関数内で定義し、それを返すということです。

//(function(window,undefined){
var jQuery=(function(){
    // Inside this function defines jQuery and return it?
    var jQuery=function(selector,context){
        return new jQuery(selector,context); //simplified
    };
    jQuery.xxx=xxx;
    //...
    return jQuery;
})(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);

これは次のようなものです。

function define_jQuery(){
    // Inside this function defines jQuery and return it?
    var jQuery=function(selector,context){
        return new jQuery(selector,context); //simplified
    };
    jQuery.xxx=xxx;
    //...
    return jQuery;
}

//(function(window,undefined){
var jQuery=define_jQuery(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);

それはもっと簡単ではないでしょうか:

//(function(window,undefined){
var jQuery=function(selector,context){
    return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
//... })(window);
4

4 に答える 4

10

これらの質問にそれぞれ個別に答える:

  1. なぜwindow合格したのですか?JavaScript で変数を逆参照するのは苦痛だからです。インスタンスを渡すということは、その必要がないことを意味します。通常、メカニズムは次のようになります。

    (function (window, document, $) {
    }(window, window.document, jQuery));
    

    このシナリオでは、これら 3 つのいずれかを逆参照するためにグローバル スコープに移動する必要はありません (そして、jQuery.noConflict()を起動することができます)。

  2. これは有効な JavaScript です: undefined = 2;. それは非常にばかげていると認めますが、可能です。しかし、渡されたものよりも多くの引数を関数で受け入れる場合、それが真undefinedであり、ハッキングされたコピーではないと確信できます。

  3. 前の関数から jQuery を返すと、メソッド チェーンが可能になります$('#sel').func1().func2()。func1 はおそらく次のように見えるため、これが可能です。

    jQuery.fn.func1 = function () {
        return $(this).each(function () {
            // do something fabulous
        };
    };
    

return $(this).bla_de_bla()次の省略形です。

    $(this).bla_de_bla(..);
    return $(this);

また、 .bla_de_bla() も返すことを前提としています$(this)

編集:.noConflict() #3 を変更して、周りを迂回して間違った名前を付けるよりも連鎖するのが最適であることを指摘しまし$た。

于 2012-07-03T04:48:58.370 に答える
1

1つの理由は、コードの縮小化です。ミニファイアは、グローバルオブジェクトを参照しなくなるため、グローバル名を縮小できません。作業しているすべてのオブジェクトを渡すことにより、それらはローカルになります。windowそうすれば、への何千もの参照をundefined縮小することができます。

于 2012-07-03T04:59:26.973 に答える
0

「ウィンドウ」パラメータのすばらしい部分は、間接参照ではありません。あるインスタンスで「window」を渡し、別のインスタンスでwindow.parentを渡すとどうなりますか(高度な機能のために親を制御する子ウィンドウを考えてみてください!!!)。

  1. 上で説明した。

  2. まだよくわかりません。

  3. 連鎖!!! 例:$('#blah')。hide()。show();

hidden関数がオブジェクト(#blah)を返さなかった場合、showはそれを使用して何もできませんでした。#blahをshow関数に返します。

JQueryは常に私よりも少し賢いです(そして私は通常、隠された手がかりを見つけます!)。

于 2012-07-03T04:58:25.323 に答える
0

パラメーターとして渡すwindowと、すべてが正確にバグになり、スペースの無駄になります。これはオブジェクトであるため、参照によって渡されます。クロージャーの内側への変更はwindow、外側と同じインスタンスに影響します。

パラメーターを取得するundefinedことは、実際の変数に名前を付けるほど愚かな人への対策ですundefined(これは新しいブラウザーではできません)。

私が知る限り、その 2 番目のインライン関数は、jQueryプロパティを定義するプロセスで一時変数が使用されている場合を除いて、まったく無意味です。

于 2012-07-03T04:46:37.223 に答える