2012-08-15 72 views
8

我們看到這種方法使用的所有時間:JavaScript Window對象始終可訪問?

(function (window) { 
    var document = window.document, 
     location = window.location, 
     navigator = window.navigator; 
})(window) 

當上述研究片斷我不知道爲什麼像window全球可訪問的對象作爲參數傳遞給函數。難道是這樣的:

  1. 開發人員不能100%確定地知道窗口可以從本地函數範圍內訪問嗎?
  2. 這是一個很好的做法,因爲您可以向讀取代碼的其他開發人員明確您的意圖。
  3. 你已經看到約翰·雷西格這樣做了,所以它一定是手指舔着'好!

您怎麼看?

+2

的重複:http://stackoverflow.com/questions/2716069/how-does-this-javascript-jquery-syntax-work-function-window-undefined – 2012-08-15 00:25:29

+0

是,似乎你對正確一。 – ChrisRich 2012-08-15 00:43:09

回答

4

它使代碼更加便攜。

您可以將代碼複製並粘貼到沒有定義全局窗口對象(例如節點)的環境中,但API代碼與您在代碼中關注的所有內容相兼容。那麼你只需要修改傳遞給函數的參數。

一個稍微的改變,使代碼更清晰:

(function(root){ 
    var document = root.document, 
     location = root.location, 
     navigator = root.navigator; 
})(window) 
2

我知道的一對夫婦可能原因的代碼,你問:

  1. 創建快捷方式documentlocationnavigator在局部變量中可能會稍微改善性能,並減少鍵入。

  2. window傳遞到自執行函數可能會導致參考window比在全局空間中使用它稍好。

  3. 有一些javascript的執行環境(不在瀏覽器中)全局對象不被調用window因此代碼可以更容易地適應。但是,這個原因似乎有點可行,因爲爲瀏覽器編寫的代碼很可能使用其他瀏覽器功能。

0
(function ($) { }(jQuery)); // $ stands for jQuery within this function 
(function (window) { }(window)); // window still equals window 
(function (bananas) { }(document)); // all references to bananas => document. (silly) 
  1. 通常頂名字是你想要的它被命名,而底部保證它應該代表。因此,在頂部有$意味着所有的jQuery代碼(在這個例子中)都是jQuery。將它用於窗口/窗口只是確保沒有其他窗口定義將其原始意圖更改爲「窗口」。
  2. 這絕對是一種最佳實踐,並且允許您在匿名函數/名稱空間內部實現所需內容。
  3. 原因之一! Resig是男人。