He estado buscando información sobre funciones invocadas de inmediato, y en algún lugar me topé con esta notación:
+function(){console.log("Something.")}()
¿Alguien puede explicarme qué +
significa / hace el signo frente a la función?
He estado buscando información sobre funciones invocadas de inmediato, y en algún lugar me topé con esta notación:
+function(){console.log("Something.")}()
¿Alguien puede explicarme qué +
significa / hace el signo frente a la función?
Respuestas:
Obliga al analizador a tratar la parte que sigue al +
como una expresión. Esto generalmente se usa para funciones que se invocan de inmediato, por ejemplo:
+function() { console.log("Foo!"); }();
Sin el +
allí, si el analizador está en un estado en el que está esperando una declaración (que puede ser una expresión o varias declaraciones de no expresión), la palabra function
parece el comienzo de una declaración de función en lugar de una expresión de función y, por lo tanto, la ()
siguiente (los que están al final de la línea anterior) serían un error de sintaxis (como sería la ausencia de un nombre, en ese ejemplo). Con el +
, lo convierte en una expresión de función, lo que significa que el nombre es opcional y que da como resultado una referencia a la función, que se puede invocar, por lo que los paréntesis son válidos.
+
Es solo una de las opciones. También puede ser -
, !
, ~
o casi cualquier otro operador unitario. Alternativamente, puede usar paréntesis (esto es más común, pero ni más ni menos correcto sintácticamente):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
Subsidiaria a la respuesta de @ TJCrowder, +
generalmente se usa para forzar la conversión numérica de un valor como explica esta respuesta SO . En este caso, se llama 'operador unario plus' (para facilitar la búsqueda en Google).
var num = +variant;
Entonces, frente a una función, puede ser una forma de forzar que el resultado de la función se interprete como un número. Dudo que suceda todavía, pero en teoría el JIT podría usar eso para compilar la función como una función numérica, etc. Sin embargo, para evitar que el plus unario sea una concatenación cuando se usa en una expresión más grande, necesitaría paréntesis:
blah + (+(function(){ var scope; return "4"; })());
(+function() { ... })()
notación nunca puede ejecutarse sin errores (aparte del hecho de que esto no responde la pregunta).
3++function...
que no sea lo mismo.
+function...
es innecesario en sí mismo. Se puede obtener el mismo resultado con el blah + function( ){ ... }( );
que se negaría la necesidad de los corchetes.
Entonces, la respuesta corta es que evita un error de sintaxis, al usar los resultados de la función de una forma u otra.
También puede indicarle al motor que ni siquiera le interesa el valor de retorno utilizando el void
operador:
void function() { console.log("Foo!"); }();
Por supuesto, poner llaves alrededor de todo esto también sirve para ese propósito.