El sitio jQuery enumera la sintaxis básica del complemento para jQuery de la siguiente manera:
(function( $ ){
$.fn.myPlugin = function() {
// there's no need to do $(this) because
// "this" is already a jquery object
// $(this) would be the same as $($('#element'));
this.fadeIn('normal', function(){
// the this keyword is a DOM element
});
};
})( jQuery );
Solo me gustaría entender lo que está sucediendo allí desde el punto de vista de Javascript, porque no parece que siga ninguna sintaxis que haya visto antes en JS. Así que aquí está mi lista de preguntas:
Si reemplaza la función ($) ... con una variable, diga "the_function", la sintaxis se ve así:
(the_function)( jQuery );
¿Qué es "(jQuery);" ¿haciendo? ¿Son realmente necesarios los paréntesis alrededor de la función? ¿Por qué están ellos ahí? ¿Hay otra pieza de código que pueda dar que sea similar?
Comienza con la función ($). Entonces, ¿está creando una función, que hasta donde yo sé, nunca se ejecutará, con el parámetro de $, que ya está definido? ¿Que esta pasando ahí?
¡Gracias por la ayuda!
fuente
(function(){})()
se conoce como IIFE (expresión de función invocada inmediatamente) . Que se sepa que puede utilizar otros símbolos para forzar al analizador para el tratamiento de la función como una expresión como+,!,-,~
(y otros) así:!function($){}(jQuery)
. Y para divertirse aún más, puede~~+-!function($){}(jQuery)
:!Esa es una función anónima autoejecutable que se usa
$
en un argumento para que pueda usarla ($
) en lugar dejQuery
dentro de esa función y sin temor a entrar en conflicto con otras bibliotecas porque en otras bibliotecas también$
tiene un significado especial. Ese patrón es especialmente útil al escribir complementos de jQuery.Puede escribir cualquier carácter allí en lugar de
$
también:Aquí se
j
pondrá al día automáticamente con jQuery especificado al final(jQuery)
. O puede omitir el argumento por completo, pero luego tendrá que usarjQuery
palabras clave en todas partes en lugar de$
sin temor a una colisión todavía. Por$
lo tanto, está envuelto en el argumento de la abreviatura para que pueda escribir en$
lugar dejQuery
todo dentro de esa función.Si incluso mira el código fuente de jQuery, verá que todo está envuelto en el medio:
Eso es como puede verse también una función anónima autoejecutable con argumentos. Se crea un argumento
window
(yundefined
) y se asigna con elwindow
objeto global en la parte inferior(window)
. Este es un patrón popular en estos días y tiene poca ganancia de velocidad porque aquíwindow
se analizará desde el argumento en lugar delwindow
objeto global que se asigna a continuación.El
$.fn
es objeto de jQuery donde se crea su nueva función (que es también un objeto) o el propio plugin jQuery para que envuelve su plugin en su$.fn
objeto y ponerlo a disposición.Curiosamente, había respondido una pregunta similar aquí:
Sintaxis de la función de cierre de JavaScript / jQuery
También puede consultar este artículo para saber más sobre las funciones autoejecutables que había escrito:
Funciones autoejecutables de JavaScript
fuente
La sintaxis básica del complemento le permite usar
$
una referenciajQuery
en el cuerpo de su complemento, independientemente de la identidad$
en el momento en que se carga el complemento. Esto evita conflictos de nombres con otras bibliotecas, especialmente Prototype.La sintaxis define una función que acepta un parámetro conocido como
$
para que pueda referirse a él como$
en el cuerpo de la función, y luego inmediatamente invoca esa función, poniéndolajQuery
como argumento.Esto también ayuda a no contaminar el espacio de nombres global (por lo que declarar
var myvar = 123;
en el cuerpo de su complemento no se definirá repentinamentewindow.myvar
), pero el principal propósito ostensible es permitirle usar$
donde$
puede haber sido redefinido desde entonces.fuente
Se trata de una función anónima que se autoinvoca allí. Es como una "mejor práctica" envolver un complemento de jQuery dentro de dicha función para asegurarse de que el
$
letrero esté vinculado aljQuery
objeto.Ejemplo:
Esto alertaría
BAR
cuando se coloque en un<script>
bloque. El parámetroBAR
se pasa a la función que se llama a sí misma.El mismo principio está sucediendo en su código, el
jQuery
objeto se pasa a la función, por lo que$
se referirá al objeto jQuery con seguridad.fuente
El jQuery al final se pasa a sí mismo (jQuery) a la función, para que pueda usar el símbolo $ dentro de su complemento. Tú también podrías hacer
fuente
Para encontrar una explicación clara de este y otros trucos modernos de JavaScript y prácticas comunes, recomiendo leer Javascript Garden.
http://bonsaiden.github.com/JavaScript-Garden/
Es especialmente útil, porque muchos de estos patrones se usan ampliamente en muchas bibliotecas pero no se explican realmente.
fuente
Las otras respuestas aquí son excelentes, pero hay un punto importante que no se ha abordado. Tu dices:
No hay garantía de que la variable global
$
esté disponible . De forma predeterminada, jQuery crea dos variables en el alcance global:$
yjQuery
(donde los dos son alias para el mismo objeto). Sin embargo, jQuery también se puede ejecutar en modo noConflict :Cuando llama
jQuery.noConflict()
, la variable global$
se vuelve a establecer en lo que era antes de que se incluyera la biblioteca jQuery. Esto permite que jQuery se utilice con otras bibliotecas de Javascript que también se utilizan$
como variable global.Si escribió un complemento que se basaba en
$
ser un alias para jQuery, entonces su complemento no funcionaría para los usuarios que se ejecutan en modo noConflict.Como ya han explicado otros, el código que publicó crea una función anónima a la que se llama inmediatamente.
jQuery
Luego, la variable global se pasa a esta función anónima, que tiene un alias seguro como la variable local$
dentro de la función.fuente