Se si utilizza una versione semplificata, potrebbe essere più comprensibile. La prima funzione pronta non sta facendo molto di più di un avviso. Gli altri due sono interessanti.
Le funzioni hanno scope, il che significa che quando si utilizza una variabile all'interno di una variabile, essa salirà nella gerarchia finché non sarà stata trovata.
Nella seconda funzione pronta, lo $
salirà allo Hi!
in quanto non vi sono altri $
se si sale iniziando all'interno della funzione.
Tuttavia, nel terzo blocco pronto, il $
non andrà al Hi!
perché ha una definizione che è più vicino - quello passato come argomento (function($) {
). Questo $
sarà la funzione jQuery (ovvero in quella funzione $ == jQuery
) in quanto è implementata la funzionalità di jQuery.
Quindi:
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
});
Ora la tua domanda riguarda il conflitto con altre biblioteche. Altre librerie (Prototype ad esempio) utilizzano anche il simbolo $
in quanto è una comoda scorciatoia per chiamare la libreria. Se utilizzi l'ultima funzione pronta che hai fornito, puoi essere sicuro che all'interno di quella funzione, $
farà riferimento a jQuery mentre jQuery passa a quella funzione (come primo argomento).
Nella seconda funzione pronta, $
potrebbe anche essere stato impostato su Prototipo, ad esempio, e non si è sicuri se si sta chiamando jQuery con $
. Nel tuo esempio, era Hi!
e non jQuery. Nel caso in cui sia Prototipo è la stessa cosa. Considerate:
// Prototype is loaded here, $ is referring to Prototype
jQuery(function() {
$('selector').addClass('something'); // Oops - you're calling Prototype with $!
});
D'altra parte:
// 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 - Il '$' assume un significato speciale se è già all'interno del gestore 'jQuery()'? Vale a dire, l'argomento passato in 'jQuery (function (argument) {...})' risolve (effettivamente) ancora la stessa cosa di '$'? – dopatraman
jQuery si assegnerà al primo argomento in un gestore jQuery. Qualunque sia il nome del primo argomento, jQuery verrà assegnato ad esso. Quindi per 'jQuery (function (argument) {...', 'jQuery (function ($) {...', e 'jQuery (function (someOtherArgument) {...', sono tutti equivalenti nel senso che ' argomento === $ === someOtherArgument' – beefyhalo
@ Beefyhalo - grazie, questo ha aiutato a chiarire le cose – dopatraman