[Javascript] ¿Qué hace el signo de exclamación antes de la función?


Answers

La función:

function () {}

no devuelve nada (o indefinido).

A veces queremos llamar a una función correcta a medida que la creamos. Es posible que tengas la tentación de probar esto:

function () {}()

pero da como resultado un SyntaxError .

Usando el ! operador antes de que la función haga que se trate como una expresión, por lo que podemos llamarlo:

!function () {}()

Esto también devolverá el valor booleano opuesto al valor de retorno de la función, en este caso true , porque !undefined es true . Si desea que el valor de retorno real sea el resultado de la llamada, intente hacerlo de esta manera:

(function () {})()
Question
!function () {}();



! es un operador NOT lógico, es un operador booleano que invertirá algo en su opuesto.

Aunque puede eludir el paréntesis de la función invocada al usar BANG (!) Antes de la función, aún así invertirá la devolución, que podría no ser la que usted quería. Como en el caso de un IEFE, devolvería indefinido , que cuando se invierte se convierte en el booleano verdadero.

En su lugar, use el paréntesis de cierre y BANG ( ! ) Si es necesario.

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

Otros operadores que trabajan ...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

Operadores combinados ...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1



Devuelve si la instrucción puede evaluar a falso. p.ej:

!false      // true
!true       // false
!isValid()  // is not valid

Puede usarlo dos veces para forzar un valor a booleano:

!!1    // true
!!0    // false

Entonces, para responder más directamente a tu pregunta:

var myVar = !function(){ return false; }();  // myVar contains true

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 que no tiene el identificador requerido (o el nombre de la función ):

function () { return false; }();  // syntax error



Es solo para guardar un byte de datos cuando hacemos una minificación de JavaScript.

considere la siguiente función anónima

function (){}

Para hacer que lo anterior sea una función de invocación automática, generalmente cambiaremos el código anterior como

(function (){}())

Ahora agregamos dos caracteres adicionales (,) además de agregar () al final de la función 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 como

!function (){}()

Aú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 !