Si toma una versión simplificada, podría ser más comprensible. La primera función lista no hace mucho más que alertar. Los otros dos son interesantes.
Las funciones tienen ámbito, lo que significa que cuando use una variable dentro de una, subirá en la jerarquía hasta que se encuentre.
En su segunda función listo, el $
va a subir a la Hi!
ya que no hay otra $
si vas a comenzar dentro de la función.
Sin embargo, en el tercer bloque listo, el $
no va a ir a la Hi!
porque tiene una definición que está más cerca - el pasado como argumento (function($) {
). Esta $
será la función jQuery (es decir, en esa función $ == jQuery
), ya que así es como se implementa la función de jQuery.
Así:
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
});
Ahora la pregunta es sobre el conflicto con otras bibliotecas. Otras bibliotecas (Prototipo, por ejemplo) también usan el símbolo $
, ya que es un atajo conveniente para llamar a la biblioteca. Si usa la última función preparada que proporcionó, puede ser seguro que dentro de esa función, $
se referirá a jQuery ya que jQuery se pasa a esa función (como primer argumento).
En la segunda función de listo, $
también podría haberse configurado en Prototype, por ejemplo, y no está seguro de si está llamando a jQuery con $
. En su ejemplo, era Hi!
y no jQuery. En caso de que sea Prototipo, es lo mismo. Considere:
// Prototype is loaded here, $ is referring to Prototype
jQuery(function() {
$('selector').addClass('something'); // Oops - you're calling Prototype with $!
});
Por otro lado:
// 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 - ¿El '$' adquiere un significado especial si ya está dentro del manejador 'jQuery()'? Es decir, ¿el argumento pasado dentro de 'jQuery (función (argumento) {...})' todavía (efectivamente) se resuelve a la misma cosa que '$'? – dopatraman
jQuery se asignará al primer argumento en un controlador jQuery. Cualquiera que sea el nombre del primer argumento, se le asignará jQuery. Así que para 'jQuery (función (argumento) {...', 'jQuery (función ($) {...', y 'jQuery (función (algún OtroArgumento) {...', son todos equivalentes en el sentido de ' argumento === $ === someOtherArgument' – beefyhalo
@ Beefyhalo - gracias, eso ayudó a aclarar las cosas – dopatraman