2010-10-02 249 views
7

我最近開始深入研究JavaScript,並在JQuery中遇到了這個代碼構造。瞭解jQuery源代碼

(function(window, undefined) { 
})(window) 

在堆棧溢出閱讀(和其他地方),我得出的結論是,這是一樣的

function foo(window, undefined) { 
    ... 
} 

foo(window); 

我在我的假設是正確的? 如果是這樣,前者的優點是什麼? (除了混淆新事物)

+0

http://stackoverflow.com/questions/2716069/how-does-this-javascript-jquery-syntax-work-function-window-undefined – user113716 2010-10-02 17:16:37

+1

爲了記錄,在這段代碼中沒有jQuery,它只是純javascript。 – 2010-10-02 18:16:42

+1

我想了解jQuery;不使用它,而是實際的jQuery源代碼,這是我第一次看到這個構造的地方。 – Elija 2010-10-03 08:09:11

回答

5

這是一個匿名函數。它被創建,然後超出範圍,這是優勢。它被立即創建和實例化。這樣做的好處是它不會與全局命名空間中的任何函數相沖突,因此不會消除您可能包含在頁面中的任何內容。

+0

這是有道理的,尤其是當與下面的答案中的鏈接相結合,並在該上下文中看到jquery中的最後幾行。 – Elija 2010-10-02 17:25:10

16

有你需要知道它的意義幾件事情:

  1. 它是一個匿名函數,它只是意味着它不會有一個名字。
  2. 該函數在聲明後立即被調用。在函數定義之後立即在第2行看到左括號。這意味着,「調用此功能」。
  3. 只有一個參數傳遞給函數。該參數是「window」,它是瀏覽器內部全局範圍的名稱。
  4. 被調用的函數實際上是需要 * 2 *參數,但是我們用一個參數調用它。使用Javascript,您可以使用比函數實際預期的參數更多或更少的參數來調用函數。有許多方法可以獲得傳遞的參數列表。
  5. 由於我們只傳遞一個參數,所以第二個參數會自動設置爲「undefined」。 「未定義」是一個特殊的javascript值,意味着準備好「未定義」。
  6. 它恰好如此,我們也有名爲我們的第二個參數的名稱爲「undefined」。所以實際上,我們創建了一個局部變量(參數非常像局部變量),它是,名稱爲未定義,其值未定義。
  7. 爲什麼我們在地球上做到了這一點?這是一種確保在我們的匿名函數中,如果我們引用「未定義」的方式,它確實將具有「未定義」的值。如果我們不這樣做,並且我們範圍外的一些瘋狂代碼重新定義了「未定義」(通過說「undefined = 42」之類的東西),那麼我們會編寫代碼,認爲我們指的是未定義的,但我們實際上是參考42.這些shenanigans通過1參數,但期待2,並呼籲第二個未定義,保護我們從這樣的廢話。

我希望這是明確的,讓我知道如果它不是。我從上面提到的Paul Irish的視頻中學到了這些。