2012-07-03 12 views
12

私は、インライン関数呼び出しでラッピングコードを理解している間、私ははっきりと変数のスコープを定義することができ、私はインライン関数呼び出しのメリットは何ですか?

のメリットを理解していない

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

(expliclyそれは修正して、jQueryのであります)このコードを見て

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

より明確EDIT書き込み#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(window,undefined){ 
var jQuery=function(selector,context){ 
    return new jQuery(selector,context); //simplified 
}; 
jQuery.xxx=xxx; 
//... 
//... })(window); 
+1

日立、http://ejohn.org/apps/workshop/adv-talk/#31 **および** http://www.bennadel.com/blog/1838-Wrapping-The-Window-Object- In-A-jQuery-Wrapper.htmが役立つはずです! ':)' –

答えて

10

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

  1. なぜに渡さwindow? JavaScriptで変数の参照を解除するのは辛いためです。インスタンスを渡すことは、あなたがする必要がないことを意味します。通常のメカニズムは次のようになります。このシナリオでは

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

    、1は、これら3つのいずれかの間接参照にグローバルスコープに行く(とjQueryをブートする.noConflict()にすることができます)必要はありません。

  2. 有効なJavaScript:undefined = 2;です。私はそれが非常に愚かであることを認めますが、可能です。しかし、1つの関数でもう1つの引数を受け入れた場合、それは本当にundefinedであり、そのハッキングされたコピーではないと確信しています。

  3. 以前の関数からjQueryを返すと、メソッド連鎖が可能になります。$('#sel').func1().func2()

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

return $(this).bla_de_bla()がために短い手です::func1のは、おそらくこのようなものになりますので、これは可能です

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

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

編集:#3を修正して、を周回するのではなく、チェーン化するのが最善であることに注意してくださいであり、$と誤って命名されています。

+0

私はそれをもっと明確にするために#3を書き直しました。どうか確認してください。 –

+0

そこにはかなりのブードーなことが起こっていますし、私たちがやっているよりも賢い人もいます。 jQueryの定義を入れ子にする必要はありませんでした。今まで参照してきたコードを見れば、私は本当に難しいものになりました。 'jQuery'の中には、「元のjQuery」(以前に定義した場合)を指し示すものもあれば、「構築しているjQuery」、「選択したもの」のものなどがあります。他のすべてが平等であれば、私はむしろ彼らには説明的な名前を付けるだろう。本当に優雅なものは 'jQuery.fn'は' jQuery.prototype'の略です。 – robrich

0

パラメータとして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); 

スペースの無駄:それはオブジェクトであり、参照によって渡されます。クロージャ内のwindowの変更は、外部と同じインスタンスに影響します。

undefinedパラメータを取得すると、私の知る限り二インライン関数が完全であること、言うことができるように(あなたがとにかく新しいブラウザで行うことはできません)実際の変数undefined

に名前を付けるのに十分な愚かな誰にでも対策ですjQueryプロパティを定義するプロセスで一時変数が使用される場合を除いて無意味です。

0

「ウィンドウ」パラメータの美しい部分は、参照解除ではありません。あるインスタンスでは「ウィンドウ」を、別のインスタンスではwindow.parentを渡すとどうなりますか?

  1. となる。

  2. 私はまだよく分かりません。

  3. チェイニング!!! ex:$( '#blah')。hide()。show();

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

JQueryは、私よりもちょっとスマートです(そして、私はたいてい隠された手がかりを見つけるのです!)。

+0

私はそれをより明確にするために#3を書き直しました。どうか確認してください。 –

1

理由の1つはコードの縮小です。修飾子はグローバル名をもはや参照しないので、グローバル名を縮小することはできません。作業しているすべてのオブジェクトを渡すことで、ローカルになります。そのようにして、windowundefinedへの何千という参照を縮小することができます。

関連する問題