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?