簡單的解釋
它只是創建了一個封閉在那裏你可以參考jQuery
與$
,即使是在noConflict mode。
也在jSang的回答(+1)的plugin authoring中解釋過。
從技術上講,它只是定義了一個匿名函數,它接受一個參數叫$
並立即調用它傳遞jQuery
作爲唯一的參數,所以$
作爲一個別名jQuery
此功能的範圍內 - 請注意,$
在全球範圍內在這個封閉內部是無法訪問的。
這意味着,如果你有在全球範圍內使用$
原型,您將無法訪問使用$
瓶蓋內原型,爲本地範圍$
它引用jQuery的優先。當然,如果在閉包中需要另一個庫的方法,您可以使用2個參數來定義它:(function($j, $p) {
,並且假定其他庫使用$
命名空間,則將其稱爲傳遞(jQuery, $)
。或者更簡單地說,將你的閉包的本地範圍var別名爲與你其他庫的全局範圍var:(function($j) {
不同,這意味着全局$
仍然可以在函數的範圍內訪問。請注意,後一種效果可能是不可取的,因爲您不能完全確定您的用戶爲$
分配了什麼內容,除非您明確地將其寫入文檔中。我猜想需要多個庫的插件有點偏離主題,所以讓我們把它留在那裏。
略爲詳細
從noConflict docs頁面的實際閉合例子:
jQuery.noConflict();
(function($) {
$(function() {
// more code using $ as alias to jQuery
});
})(jQuery);
那封別名jQuery
作爲$
的範圍內,如果您的用戶非常有用例如,Prototype或其他使用$
全局名稱空間的庫。這使得你的插件更加堅固而且不易出錯。
無論jQuery是否控制$變量,都可以使用閉包,因此非常適合插件創作。
試想一下,如果你的最終用戶的一個有jQuery的在noConflict模式和原型使用$
命名空間,你的插件試圖用jQuery方法擴展$
?混沌和小馬!
當然,您可以跳過關閉並將$
全部替換爲jQuery
,但它會使您的代碼更長,更難以被許多開發人員讀取。
此外,如果您無法理解閉包,那麼How do JavaScript closures work?有很多有用的答案,即使這個問題不需要太多關於閉包的深入知識。 :)
哦不錯,你解決了自執行方面非常好,我忽略了最初+1 – 2012-07-20 05:08:19