2012-10-12 37 views
7

最近我在讀別人的代碼,並跨越這來了:

// Semicolon (;) to ensure closing of earlier scripting 
// Encapsulation 
// $ is assigned to jQuery 
;(function($) { 

    // DOM Ready 
    $(function() { 
     ... 
    }); 

})(jQuery); 

我明白了領先的地步;,據我所知,$(函數(){與文檔準備相同,但添加函數($)的意義是什麼?

我明白這是一個閉包,但由於這個函數總是在全局範圍內調用, $(function(){將使用同一個全局對象,不是嗎?

是爲了防範某些事情,還是因爲其他原因而成爲最佳實踐?

回答

12

這是一個jQuery插件的常見結構。它可以防止$標識符被覆蓋並用於其他內容。在匿名函數中,$總是要引用jQuery。

例子:

$ = "oh no"; 
$(function() { //Big problem! 
    //DOM ready 
}); 

通過引入新的範圍,可以保證$是指你指望它什麼:

$ = "oh no"; 
(function($) { //New scope, $ is redeclared and jQuery is assigned to it 

    $(function() { //No problem! 
     //DOM ready 
    }); 

}(jQuery)); 

這背後的主要理由是,許多其他JavaScript庫使用$作爲標識符(例如PrototypeJS)。如果您想同時使用Prototype和jQuery,則需要讓Prototype具有$標識符,但您可能不希望在每次調用jQuery方法時都寫出jQuery。通過引入一個新的範圍,您允許jQuery將其$放回該執行上下文中。

1

您所提供的代碼樣品是自調用函數的一個例子:

(function(){ 
// some code… 
})(); 

第一組括號定義了一個函數:(匿名函數包裹在括號中)

(function() {}) 

定義了匿名函數。它本身並沒有做任何事情。但是如果在定義之後添加一組括號(),則與用於調用函數的圓括號相同。 嘗試了這一點:

(function(message) { 
    alert(message); 
})("Hello World"); 

即創建,它接受一個參數的函數,並顯示包含所提供的值的警報對話框。然後,它立即使用「Hello World」參數調用該函數。


在您的示例中,定義了一個自調用函數。它接受一個名爲$的參數。然後,立即調用該函數,並參考jQuery作爲參數傳入。

如果您希望jQuery以noConflict()模式運行(將全局引用移除到$),這很常見。

noConflict()模式下,您仍然可以通過jQuery全局變量訪問jQuery的,但大多數人寧願使用$,所以這種自我調用函數接受全球jQuery變量命名$在功能的範圍參數,這使您可以在自調用函數中自由使用$快捷方式,同時使jQuery以noConflict()模式運行,以避免與在全局範圍內使用$的其他庫發生衝突。

希望這回答你的問題!

+0

謝謝你的解釋! – nycynik

相關問題