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 dejQuerydentro 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
jpondrá al día automáticamente con jQuery especificado al final(jQuery). O puede omitir el argumento por completo, pero luego tendrá que usarjQuerypalabras 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 dejQuerytodo 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 elwindowobjeto global en la parte inferior(window). Este es un patrón popular en estos días y tiene poca ganancia de velocidad porque aquíwindowse analizará desde el argumento en lugar delwindowobjeto global que se asigna a continuación.El
$.fnes 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$.fnobjeto 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 referenciajQueryen 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éndolajQuerycomo 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 aljQueryobjeto.Ejemplo:
Esto alertaría
BARcuando se coloque en un<script>bloque. El parámetroBARse pasa a la función que se llama a sí misma.El mismo principio está sucediendo en su código, el
jQueryobjeto 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.
jQueryLuego, 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