2011-11-29 29 views
14

我調試別人的JavaScript代碼和大多數的代碼被包裹這樣的:

(function ($) { 
    //majority of code here... 
})(jQuery); 

這是怎麼回事與($)(jQuery)?我沒有被教會編碼這樣,並沒有看到他們。他們的目的是什麼?

同樣,沒有document.ready,但我認爲,這是因爲它是由();末讀之後被執行的代碼?

+0

該代碼將在document.ready – longbkit

+5

上執行@longbkit:Nope,這不是DOM就緒代碼。 – RightSaidFred

+4

@longbkit,不,這不是什麼意思。請去閱讀關於..或者,地獄,開始學習JavaScript。 –

回答

16
var $ = "some value we don't care about"; 

// v=====normal plain old function 
(function ($) { 
//  ^=======receives jQuery object as the $ parameter 

    //majority of code here, where $ === jQuery... 

    $('.myclass').do().crazy().things(); 


})(jQuery); 
// ^=======immediately invoked, and passed the jQuery object 


// out here, $ is undisturbed 
alert($); // "some value we don't care about" 
+3

好吧,所以基本上這樣做的目的是讓你可以在該函數內用$()表示法調用jQuery,並且在該函數外部如果其他類似原型的東西使用$()表示法,它並不重要。所以實際上,這樣可以避免每次不使用衝突時都必須編寫jQuery()(或其他表示法)。有意義 – tsdexter

+2

基本上,所有內容,即「大部分代碼......」都是孤立的來自代碼的其餘部分。它存在於單獨的範圍內。如果你在那裏創建'var something = 1',它不會在全局'window'範圍內結束。這個結構之外的代碼不能覆蓋裏面的任何東西。 –

+1

@tsdexter:是的,你知道了。全局'jQuery'由本地'$'引用,這意味着全局'$'(如果有的話)可以用於其他目的。在JavaScript中,變量作用域是通過函數創建的。 – RightSaidFred

13

當你想/需要使用jQuery.noConflict()這是有用的,全局名稱$不是jQuery的一個別名。您發佈的代碼可讓您使用較短的$表示jQuery只在匿名函數中,而不需要$需要成爲全局代碼。

+0

謝謝,雖然RightSaidFred擊敗你。非常感激。 – tsdexter

+0

+1提到'jQuery.noConflict',這讓jQuery放棄了全局'$'。 – RightSaidFred

0

這個結構被稱爲JQuery插件,插件的目的是爲您的項目創建任何常見任務/功能的框架,同樣您可以根據您在不同頁面或同一頁面中的使用情況擴展插件。這樣你可以避免在任何地方重複使用相同的代碼。

檢查出來http://docs.jquery.com/Plugins/Authoring

+0

該結構不僅僅是一個jQuery構造。雖然它可能在創建插件時使用,但並不需要。 jQuery插件是通過擴展'jQuery.prototype'創建的。 – RightSaidFred

3

只是對RightSaidFred's答案擴大一點,當我第一次看到()()語法我有點昏昏沉沉,但一旦我實現了支架被用來定義匿名它是有道理的函數,然後調用它。例如:

(function (msg){alert(msg)})('hello'); 

...定義一個函數,然後調用它,傳遞'hello'作爲參數。

所以在這個問題的例子:

(function ($) { 
    //majority of code here... 
})(jQuery); 

被路過的jQuery成一個匿名函數,並稱之爲是$功能,保證$將jQuery的工作,沒有與任何其他干擾的方式中。

+1

出於某種原因,這個解釋點擊了我更好一點:)謝謝! – JoshP

相關問題