!function () {}();
javascript
function
Sebastian Otto
fuente
fuente
Respuestas:
Sintaxis de JavaScript 101. Aquí hay una declaración de función :
Tenga en cuenta que no hay punto y coma: esto es solo una declaración de función . Necesitaría una invocación,,
foo()
para ejecutar realmente la función.Ahora, cuando agregamos el signo de exclamación aparentemente inocuo:
!function foo() {}
lo convierte en una expresión . Ahora es una expresión de función .El
!
solo no invoca la función, por supuesto, pero ahora podemos poner()
al final:!function foo() {}()
que tiene mayor precedencia que!
e instantáneamente llama a la función.Entonces, lo que está haciendo el autor es guardar un byte por expresión de función; una forma más legible de escribir sería esta:
Por último,
!
hace que la expresión vuelva verdadera. Esto se debe a que, por defecto, todos los IIFE devuelvenundefined
, lo que nos deja con lo!undefined
que estrue
. No particularmente útil.fuente
!
devuelve boolean, todos lo sabemos, pero el gran punto que destaca es que también convierte la declaración de declaración de función en una expresión de función para que la función se pueda invocar inmediatamente sin ponerla entre paréntesis. No es obvio, y claramente la intención del codificador.var foo =
rompe la ambigüedad de la declaración / expresión y simplemente puede escribir,var foo = function(bar){}("baz");
etc.La función:
no devuelve nada (o indefinido).
A veces queremos llamar a una función correctamente a medida que la creamos. Puede sentirse tentado a intentar esto:
pero resulta en a
SyntaxError
.El uso del
!
operador antes de la función hace que se trate como una expresión, por lo que podemos llamarlo:Esto también devolverá el opuesto booleano del valor de retorno de la función, en este caso
true
, porque!undefined
estrue
. Si desea que el valor de retorno real sea el resultado de la llamada, intente hacerlo de esta manera:fuente
!
es convertir la declaración de función en una expresión de función, eso es todo.!function
sintaxisHay un buen punto para usar la
!
invocación de funciones marcada en la guía JavaScript de airbnbGeneralmente es una idea para usar esta técnica en archivos separados (también conocidos como módulos) que luego se concatenan. La advertencia aquí es que los archivos deben ser concatenados por herramientas que colocan el nuevo archivo en la nueva línea (que de todos modos es un comportamiento común para la mayoría de las herramientas de concat). En ese caso, el uso
!
ayudará a evitar errores si el módulo concatenado anteriormente omitió el punto y coma final y, sin embargo, eso le dará la flexibilidad para colocarlos en cualquier orden sin preocupaciones.Funcionará igual que
pero guarda un personaje y arbitrario se ve mejor.
Y, por cierto cualquiera de
+
,-
,~
,void
los operadores tienen el mismo efecto, en cuanto a la invocación de la función, a ciencia cierta si tiene que usar algo para volver de esa función que actuarían de manera diferente.pero si usa patrones IIFE para una separación de código de módulo de un archivo y usa la herramienta concat para la optimización (que hace que una línea sea un trabajo de archivo), entonces construcción
Hará una ejecución de código segura, igual que una primera muestra de código.
Este arrojará un error porque JavaScript ASI no podrá hacer su trabajo.
Una nota con respecto a los operadores unarios, harían un trabajo similar, pero solo en caso de que no lo usaran en el primer módulo. Por lo tanto, no son tan seguros si no tiene control total sobre la orden de concatenación.
Esto funciona:
Esto no:
fuente
Devuelve si la declaración puede evaluar a falso. p.ej:
Puede usarlo dos veces para forzar un valor a booleano:
Entonces, para responder más directamente a su pregunta:
Editar: tiene el efecto secundario de cambiar la declaración de función a una expresión de función. Por ejemplo, el siguiente código no es válido porque se interpreta como una declaración de función a la que le falta el identificador requerido (o el nombre de la función ):
fuente
var myVar = !function(){ return false; }()
podría omitir el me!
gustavar myVar = function(){ return false; }()
y la función se ejecutará correctamente y el valor de retorno no se verá afectado.true
con!0
yfalse
con!1
. Ahorra 2 o 3 caracteres.Es solo para guardar un byte de datos cuando hacemos la minificación de javascript.
considere la siguiente función anónima
Para hacer lo anterior como función de auto invocación, generalmente cambiaremos el código anterior como
Ahora agregamos dos caracteres adicionales
(,)
además de agregar()
al final de la función lo que es necesario para llamar a la función. En el proceso de minificación generalmente nos enfocamos en reducir el tamaño del archivo. Entonces también podemos escribir la función anterior comoAún así, ambas son funciones de invocación automática y también guardamos un byte. En lugar de 2 caracteres
(,)
, solo usamos un personaje!
fuente
! es un operador NOT lógico , es un operador booleano que invertirá algo en su opuesto.
Aunque puede omitir los paréntesis de la función invocada utilizando BANG (!) Antes de la función, todavía invertirá el retorno, que podría no ser lo que deseaba. Como en el caso de un IEFE, volvería indefinido , que cuando se invierte se convierte en el verdadero booleano.
fuente
El signo de exclamación hace que cualquier función siempre devuelva un valor booleano.
El valor final es la negación del valor devuelto por la función.
Omitir
!
en los ejemplos anteriores sería un SyntaxError .Sin embargo, una mejor manera de lograr esto sería:
fuente
!
cambia la forma en que el tiempo de ejecución analiza la función. Hace que el tiempo de ejecución trate la función como una expresión de función (y no una declaración). Hace esto para permitir que el desarrollador invoque inmediatamente la función utilizando la()
sintaxis.!
también se aplicará (es decir, negación) al resultado de invocar la expresión de función.Es otra forma de escribir IIFE (expresión de función invocada inmediatamente).
Su otra forma de escribir:
igual que
fuente
(function (args) {...})()
sintaxis más explícita y dejar ese!function
formulario a las herramientas de minificación y ofuscación.!
negará (opuesto) lo que sea que esté esperando como resultado, es decir, si tienecuando llame
boy
, su resultado serátrue
, pero en el momento en que agregue el!
al llamarboy
, es decir!boy
, su resultado seráfalse
. En otras palabras, te refieres a NotBoy , pero esta vez es básicamente un resultado booleano, ya seatrue
ofalse
.Eso es lo mismo que le sucede a la
!function () {}();
expresión, la ejecución solo lefunction () {}();
indicará un error, pero si se agrega!
justo delante de sufunction () {}();
expresión, es lo opuesto a lofunction () {}();
que debería devolverletrue
. El ejemplo se puede ver a continuación:fuente