我調試別人的JavaScript代碼和大多數的代碼被包裹這樣的:
(function ($) {
//majority of code here...
})(jQuery);
這是怎麼回事與($)
和(jQuery)
?我沒有被教會編碼這樣,並沒有看到他們。他們的目的是什麼?
同樣,沒有document.ready
,但我認爲,這是因爲它是由();
末讀之後被執行的代碼?
我調試別人的JavaScript代碼和大多數的代碼被包裹這樣的:
(function ($) {
//majority of code here...
})(jQuery);
這是怎麼回事與($)
和(jQuery)
?我沒有被教會編碼這樣,並沒有看到他們。他們的目的是什麼?
同樣,沒有document.ready
,但我認爲,這是因爲它是由();
末讀之後被執行的代碼?
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"
好吧,所以基本上這樣做的目的是讓你可以在該函數內用$()表示法調用jQuery,並且在該函數外部如果其他類似原型的東西使用$()表示法,它並不重要。所以實際上,這樣可以避免每次不使用衝突時都必須編寫jQuery()(或其他表示法)。有意義 – tsdexter
基本上,所有內容,即「大部分代碼......」都是孤立的來自代碼的其餘部分。它存在於單獨的範圍內。如果你在那裏創建'var something = 1',它不會在全局'window'範圍內結束。這個結構之外的代碼不能覆蓋裏面的任何東西。 –
@tsdexter:是的,你知道了。全局'jQuery'由本地'$'引用,這意味着全局'$'(如果有的話)可以用於其他目的。在JavaScript中,變量作用域是通過函數創建的。 – RightSaidFred
當你想/需要使用jQuery.noConflict()
這是有用的,全局名稱$
不是jQuery的一個別名。您發佈的代碼可讓您使用較短的$
表示jQuery
只在匿名函數中,而不需要$
需要成爲全局代碼。
謝謝,雖然RightSaidFred擊敗你。非常感激。 – tsdexter
+1提到'jQuery.noConflict',這讓jQuery放棄了全局'$'。 – RightSaidFred
這個結構被稱爲JQuery插件,插件的目的是爲您的項目創建任何常見任務/功能的框架,同樣您可以根據您在不同頁面或同一頁面中的使用情況擴展插件。這樣你可以避免在任何地方重複使用相同的代碼。
該結構不僅僅是一個jQuery構造。雖然它可能在創建插件時使用,但並不需要。 jQuery插件是通過擴展'jQuery.prototype'創建的。 – RightSaidFred
只是對RightSaidFred's答案擴大一點,當我第一次看到()()
語法我有點昏昏沉沉,但一旦我實現了支架被用來定義匿名它是有道理的函數,然後調用它。例如:
(function (msg){alert(msg)})('hello');
...定義一個函數,然後調用它,傳遞'hello'作爲參數。
所以在這個問題的例子:
(function ($) {
//majority of code here...
})(jQuery);
被路過的jQuery成一個匿名函數,並稱之爲是$功能,保證$將jQuery的工作,沒有與任何其他干擾的方式中。
出於某種原因,這個解釋點擊了我更好一點:)謝謝! – JoshP
該代碼將在document.ready – longbkit
上執行@longbkit:Nope,這不是DOM就緒代碼。 – RightSaidFred
@longbkit,不,這不是什麼意思。請去閱讀關於..或者,地獄,開始學習JavaScript。 –