如果您採用簡化版本,可能會更容易理解。第一個準備就緒的功能並不比提醒更多。另外兩個很有意思。
函數具有範圍,這意味着當您在一個變量中使用變量時,它將在層次結構中上升直到找到它。
在您的第二個就緒功能中,$
將上升到Hi!
,因爲如果您在該功能內部開始時沒有其他$
。
但是,在第三個就緒塊中,$
將不會轉到Hi!
,因爲它的定義更接近 - 作爲參數傳遞的定義(function($) {
)。這$
將是jQuery函數(即在那個函數$ == jQuery
),因爲這是如何實現jQuery的ready功能。
所以:
var $ = 'Hi!';
jQuery(function() {
alert('$ = ' + $); // in this scope, $ will refer to the 'Hi!'
});
jQuery(function($) { // the $ here will 'shadow' the $ defined as 'Hi!'
alert('$ = ' + $); // in this scope, $ will refer to jQuery
});
現在你的問題是關於與其他圖書館衝突。其他庫(例如原型)也使用$
符號,因爲它是調用庫的方便捷徑。如果你使用你提供的最後一個就緒函數,你可以是當然那個函數裏,$
將引用jQuery,因爲jQuery將自身傳遞給該函數(作爲第一個參數)。
在第二個就緒函數中,例如$
也可能已設置爲Prototype,並且您不確定是否使用$
調用jQuery。在你的例子中,它是Hi!
而不是jQuery。如果是Prototype,它是一樣的。試想一下:
// Prototype is loaded here, $ is referring to Prototype
jQuery(function() {
$('selector').addClass('something'); // Oops - you're calling Prototype with $!
});
在另一方面:
// Prototype is loaded here, $ is referring to Prototype
jQuery(function($) { // this $ is shadowing Prototype's $, this $ is jQuery
$('selector').addClass('something'); // Yay - you're calling jQuery with $
});
@ Beefyhalo - '$'是否具有特殊含義,如果它已經在'jQuery()'處理程序中了? 也就是說,在'jQuery(function(argument){...})中傳遞的參數是否仍然(有效)解析爲與$'相同的東西? – dopatraman
jQuery將自己分配給jQuery處理程序中的第一個參數。無論第一個參數的名稱是什麼,jQuery都會被分配給它。所以對於'jQuery(function(argument){...','jQuery(function($){...'和'jQuery(function(someOtherArgument){...'),參數=== $ === someOtherArgument' – beefyhalo
@ Beefyhalo - 謝謝,這有助於澄清事情 – dopatraman