2012-07-03 59 views
12

我看到這個代碼(explicly它在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); 
+1

Hiya,http://ejohn.org/apps/workshop/adv-talk/#31 ** and ** 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)); 
    

    在這種情況下,一個不需要去在全球範圍內取消引用這三種的(和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)

編輯:修改#3注意最好在鏈接而不是環繞.noConflict()和錯誤的$

+0

我已經重寫了#3以使其更清楚,您可以檢查一下嗎? –

+0

在這裏有一些漂亮的巫術事情發生,一些相當尖頭的人比我們兩個人都做得更聰明。我從來沒有像過去那樣嵌套jQuery定義,並且仔細查看剛剛引用的代碼確實讓我眯起了眼睛。有些「jQuery」是指向「原始jQuery」的指針(如果您之前已經定義了它),有些指向「我們正在構建的jQuery」,有些指向「您所做的選擇」。除此之外,我寧願他們有更多的描述性名字。真正優雅的是'jQuery.fn'是'jQuery.prototype'的縮寫。 – robrich

0

傳遞window作爲參數精確地完成所有開溜,是一個浪費空間:它是一個對象,所以通過參考傳遞。閉包內的任何對window的更改都會影響與外部相同的實例。

獲得一個undefined參數的對策對任何人傻到命名一個實際的變量undefined(你不能在新的瀏覽器做反正)

至於我可以告訴大家,那第二個內聯函數是完全毫無意義,除非在定義jQuery屬性的過程中使用臨時變量。

0

關於「窗口」參數的美麗部分不是取消引用。如果你在一個實例中傳入「window」,而在另一個實例中傳入window.parent(想想控制父進程功能的子窗口,那麼!!!)。

  1. 上面解釋。

  2. 我還不太確定。

  3. 鏈接!!!例如:$('#blah')。hide()。show();

如果hide函數沒有返回對象(#blah),那麼show就不能做任何事情!它將#blah返回到演出功能。

JQuery總是比我更聰明(我通常會發現隱藏的線索!)。

+0

我已經重寫了#3以使其更清楚,您可以檢查嗎? –

1

一個原因是代碼縮小。縮小器無法縮小全局名稱,因爲它們不再引用全局對象。通過傳入所有與之合作的對象,它們將成爲本地對象。這樣可以縮小數千個對windowundefined的引用。