español - ¿Qué hace! Function($){$(function(){})}(window.jQuery) do?
jquery function (1)
Vamos a explicar al desglosar el código
function () {
}()
O a menudo escrito como
(function () {
})()
Es una función self-invoking anonymous
autoinvocada , también conocida como expresiones de función invocadas de manera inmediata (IIFE) . Que ejecuta la función anónima en línea inmediatamente.
Lea más sobre esto en Explicar la sintaxis de la función anónima encapsulada .
Las funciones anónimas son una característica poderosa y tienen beneficios como el alcance ("espaciado variable de nombres"), consulte ¿Cuál es el propósito de una función autoejecutable en JavaScript? .
Ahora están usando
function ($) {
}(window.jQuery)
¡Salteemos el !
por ahora.
Entonces están pasando, window.jQuery
en esa función como argumento y aceptando como $
.
Lo que hace esto es convertir $
un alias en window.jQuery
(Objeto jQuery original) y, por lo tanto, garantizar que $
siempre se refiera al jQuery object
dentro de ese closure
, sin importar si otra biblioteca ha tomado ese ( $
) fuera.
Entonces, el código que escriba dentro de ese cierre con $
siempre funcionará.
Otro beneficio es que $
entra como argumento en la función anónima, lo que lo acerca más a la scope chain
y, por lo tanto, le toma menos tiempo al intérprete JS encontrar el objeto $
dentro del cierre de lo que de otro modo tomaría si usáramos el indicador global $
.
$(function(){
})
Es el bloque listo para documentos de jQuery como ya sabrá, lo que asegura que el código dentro de esta función se ejecutará cuando dom is ready
, y por lo tanto todos los event binding''s
funcionarán correctamente.
Lea más en http://api.jquery.com/ready/
¡Y qué es eso !
¿Ha sido bien explicado here o en ¿Qué hace el signo de exclamación antes de la función?
En breve:
Para demostrar los beneficios de !
, Vamos a considerar un caso,
(function() {
alert(''first'');
}())
(function() {
alert(''second'');
}())
Si pega el código anterior en la console
, recibirá dos alertas, pero luego obtendrá este error
TypeError: undefined is not a function
¿Por qué sucede esto? Simulemos cómo los motores JS ejecutan el bloque de código anterior. Ejecuta esta función de function() {alert(''first'');}()
anónima function() {alert(''first'');}()
muestra la alerta y, como regresa, no se devuelve nada undefined
dentro de ()
. Lo mismo ocurre con la segunda función también. Entonces, después de la ejecución de este bloque, termina teniendo algo así como
(undefined)(undefined)
y como su sintaxis es como una función self-invoking anonymous
misma, intenta llamar a esa función, pero la primera, (undefined)
no es una función. Por lo tanto, no se undefined is not a function
error de undefined is not a function
. !
corrige este tipo o errores. ¿Qué pasa con !
. Estoy citando las líneas del enlace de respuesta anterior.
Cuando usa!, La función se convierte en el único operando del operador NOT unario (lógico).
Esto obliga a la función a evaluarse como una expresión, lo que permite que se invoque inmediatamente en línea.
y esto resuelve el problema anterior, ¡podemos reescribir el bloque anterior usando !
me gusta
!(function() {
alert(''first'');
}())
!(function() {
alert(''second'');
}())
Para su caso, puede simplemente poner su código de información sobre herramientas dentro de un bloque listo para documentos como este
$(function(){
$("[rel=tooltip]").tooltip();
});
y funcionará bien.
Y si solo usas $("[rel=tooltip]").tooltip()
sin ningún doc ready block
, entonces hay una posibilidad cuando se ejecutará este código, no hay ningún elemento con rel=tooltip
en DOM todavía. Entonces $("[rel=tooltip]")
devolverá un conjunto vacío y la tooltip
no funcionará.
Un marcado de ejemplo cuando no funcionará sin el doc ready block
,
.
.
.
<script type="text/javascript">
$("[rel=tooltip]").tooltip();
</script>
.
.
.
.
<a href="#" rel="tooltip">Something</a>
<a href="#" rel="tooltip">Something</a>
<a href="#" rel="tooltip">Something</a>
Como navegadores, interpreta el marcado secuencialmente, ejecutará el código js tan pronto como lo enfrente. Y cuando ejecuta el bloque JS aquí, todavía no ha analizado las etiquetas a a rel="tooltip"
, como aparece después del bloque JS, por lo que no están en DOM en ese momento.
Entonces, para el caso anterior, $("[rel=tooltip]")
está vacío y, por lo tanto, la información sobre herramientas no funcionará. Por lo tanto, siempre es seguro poner todo su código JS dentro del bloque de document ready
como
$(function){
// put all your JS code here
});
Espero que todo esto tenga sentido para ti ahora.
Estoy usando Twitter bootstrap para crear un sitio y estaba tratando de inicializar información sobre herramientas. Además de agregar algo como:
$("[rel=tooltip]").tooltip() en application.js, a menos que conserve, el siguiente fragmento de código utilizado en los documentos de arranque, mis tooltips no se inicializan.
!function ($) { $(function(){ }) }(window.jQuery)
¿Qué hace el código anterior?