¿Qué hace un signo de exclamación delante de una función?

 !function () {}(); 
1089
21 сент. conjunto de Sebastian Otto 21 sept. 2010-09-21 00:21 '10 a las 0:21 2010-09-21 00:21
@ 10 respuestas

Sintaxis de JavaScript 101. Aquí está la declaración de la función :

 function foo() {} 

Tenga en cuenta que no hay punto y coma: esta es solo una función de anuncio . Necesitas llamar a foo() para ejecutar la función.

Ahora, cuando agregamos un signo de exclamación aparentemente inocuo:! !function foo() {} lo convierte en una expresión . Ahora esta es una expresión de función .

Sólo ! no llama a una función, pero ahora podemos poner () al final !function foo() {}() , que tiene una prioridad más alta que ! , y al instante llama a la función.

Entonces, lo que el autor hace es guardar un byte en la expresión de la función; La forma más legible de escribir será la siguiente:

 (function(){})(); 

Por fin hace que la expresión de retorno sea verdadera. Esto se debe al hecho de que, por defecto, todas las IIFE devuelven undefined , lo que nos deja con !undefined , lo cual es true . No es particularmente útil.

1837
13 апр. Respuesta dada por Neil el 13 de abril. 2011-04-13 23:02 '11 a las 11:02 pm 2011-04-13 23:02

Función:

 function () {} 

No devuelve nada (o indefinido).

A veces queremos llamar a una función de la derecha cuando la creamos. Puede sentirse tentado a probar lo siguiente:

 function () {}() 
border=0

pero esto resulta en un SyntaxError .

¡Usando el operador ! Antes de que una función haga que se trate como una expresión, podemos llamarla:

 !function () {}() 

Esto también devuelve el valor lógico 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 una llamada, intente lo siguiente:

 (function () {})() 
346
21 сент. Respuesta dada por Michael Burr el 21 de septiembre. 2010-09-21 00:28 '10 a las 0:28 2010-09-21 00:28

¡Hay un buen punto para usar ! llamar a una función marcada en la guía javascript de airbnb

En general, la idea de usar este método en archivos separados (también llamados módulos) que luego se concatenan. La advertencia aquí es que los archivos deben combinarse con herramientas que pongan el nuevo archivo en una nueva línea (lo cual es normal para la mayoría de las herramientas de concat). En este caso, utilice ! ayudará a evitar un error si un módulo previamente concatenado omitió el punto final con una coma, y ​​aún así le dará la flexibilidad de ponerlos en cualquier orden sin preocuparse.

 !function abc(){}() !function bca(){}(); 

Funcionará igual que

 !function abc(){}() ;(function bca(){})(); 

pero guarda dos personajes y se ve mejor.

Y, por cierto, cualquiera de los operadores + , - , ~ , void tiene el mismo efecto, en términos de la función de llamada, si usa algo para regresar de esta función, actuarán de manera diferente.

 abcval = !function abc(){return true;}() // abcval equals false bcaval = +function bca(){return true;}() // bcaval equals 1 zyxval = -function zyx(){return true;}() // zyxval equals -1 xyzval = ~function xyz(){return true;}() // your guess? 

pero si usa plantillas IIFE para un solo archivo, separe el código del módulo y use la herramienta concat para optimizar (lo que hace que sea una tarea de una línea de una sola línea) que la construcción

 !function abc() {}() +function bca() {}() 

Realiza la ejecución segura de código, igual que en el primer ejemplo de código.

Esto causará un error de javascript. ASI no podrá hacer su trabajo.

 !function abc() {}() (function bca() {})() 

Una nota es relativa a los operadores unarios, harán el mismo trabajo, pero solo si no se usan en el primer módulo. Por lo tanto, no son tan seguros si no tiene un control completo sobre el orden de concatenación.

Funciona

 !function abc() {}() ^function bca() {}() 

Esto no es

 ^function abc() {}() !function bca() {}() 
51
01 окт. La respuesta se da dmi3y 01 oct. 2013-10-01 21:10 '13 a las 9:10 pm 2013-10-01 21:10

Devuelve si el operador puede evaluar a falso. por ejemplo:

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

Puedes usarlo dos veces para forzar un valor para un booleano:

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

Entonces, para responder con más precisión a tu pregunta:

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

Edición: Esto tiene el efecto secundario de cambiar una 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 en la que falta el identificador requerido (o nombre de la función):

 function () { return false; }(); // syntax error 
28
21 сент. la respuesta la da gilly3 21 sep . 2010-09-21 00:25 '10 a las 0:25 2010-09-21 00:25

Solo para guardar un byte de datos al miniaturizar javascript.

considera una función anónima debajo

 function (){} 

Para hacer la función de auto invocación anterior, usualmente modificamos el código anterior como

 (function (){}()) 

Ahora hemos agregado dos caracteres adicionales (,) , además de agregar () al final de la función necesaria para llamar a la función. En el proceso de minimización, usualmente nos enfocamos en reducir el tamaño del archivo. Por lo tanto, también podemos escribir la función anterior como

 !function (){}() 

Sin embargo, ambas son funciones de invocación automática y también guardamos bytes. En lugar de dos caracteres (,) usamos un solo personaje !

5
05 сент. La respuesta es Varatharaj 05 sep . 2017-09-05 13:05 '17 a la 1:05 pm 2017-09-05 13:05

El signo de exclamación hace que cualquier función devuelva siempre un valor booleano. El valor final es la negación del valor devuelto por la función.

 !function bool() { return false; }() // true !function bool() { return true; }() // false 

! Omitiendo ! en los ejemplos anteriores habrá un syntaxError.

 function bool() { return true; }() // SyntaxError 

Sin embargo, la mejor manera de lograr esto es:

 (function bool() { return true; })() // true 
5
06 мая '13 в 17:49 2013-05-06 17:49 la respuesta es Oozzal 06 de mayo '13 a las 17:49 2013-05-06 17:49

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

Aunque puede omitir los paréntesis de la función a la que se llama con BANG (!) Antes de la función, todavía invierte la devolución, que puede que no sea lo que quería. Como en el caso de IEFE, devuelve indefinido, que, cuando se invierte, se convierte en el valor lógico verdadero.

En su lugar, use un soporte 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 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 
5
31 июля '15 в 19:36 2015-07-31 19:36 SoEzPz da la respuesta el 31 de julio de 2015 a las 7:36 pm 2015-07-31 19:36

Otra forma de escribir IIFE (expresión de función directa).

Otra forma de escribir es

 (function( args ) {})() 

lo mismo que

 !function ( args ) {}(); 
2
06 марта '16 в 12:56 2016-03-06 12:56 la respuesta se da kamal 06 de marzo de 2016 a las 12:56 2016-03-06 12:56

Vamos a guardar algunos otros bytes!

 (() => {})() 

ejemplo:

 (() => {return "yeah"})() 
0
23 июня '18 в 9:24 2018-06-23 09:24 Zibri da la respuesta el 23 de junio de 18 a las 9:24 am 2018-06-23 09:24

! negará (al contrario) lo que esperas como resultado, es decir, si tienes

 var boy = true; undefined boy true !boy false 

Cuando llames boy , tu resultado será true , ¡pero tan pronto como lo agregues ! Cuando llames boy , es decir, !boy , tu resultado será false . En otras palabras, te refieres a NotBoy , pero esta vez es básicamente un resultado lógico: true o false .

Lo mismo sucede con la expresión !function () {}(); , y solo function () {}(); te señalará un error, pero añade ! justo antes de la function () {}(); expresión function () {}(); hace que sea lo contrario de function () {}(); > Lo que debería devolverte true . Un ejemplo se puede ver a continuación:

 function () {}(); SyntaxError: function statement requires a name !function () {}(); true 
0
13 янв. La respuesta se da antzshrek 13 jan. 2018-01-13 18:55 '18 a las 6:55 pm 2018-01-13 18:55

Otras preguntas sobre etiquetas de o hacer una pregunta