Signo más de JavaScript delante de la expresión de función
He estado buscando información sobre funciones inmediatas, y en algún lugar me topé con esta notación:
+function(){console.log("Something.")}()
¿Alguien puede explicarme qué significa/hace el signo + delante de la función?
Respuesta #1
Obliga al analizador a tratar la parte que sigue al + como una expresión. Esto se usa generalmente para funciones que se invocan de inmediato, por ejemplo:
+function() { console.log("Foo!"); }();
Sin el + allí, si el analizador está en un estado donde espera una instrucción (que puede ser una expresión o varias instrucciones que no sean expresiones), 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, los () que la siguen (los que están al final de la línea anterior) serían un error de sintaxis (al igual que la ausencia de un nombre, en ese ejemplo). Con el +, se convierte en una expresión de función, lo que significa que el nombre es opcional y que resulta en 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 prácticamente cualquier otro operador unario. Alternativamente, puedes usar paréntesis (esto es más común, pero no más ni menos correcto sintácticamente):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
Respuesta #2
Subsidiario a la respuesta de @TJCrowder, + generalmente se usa para forzar la conversión numérica de un valor, como explica esta respuesta de SO. En este caso se llama el 'operador unario más' (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 ocurra todavía, pero teóricamente el JIT podría usar eso para compilar la función como una función solo numérica, etc. Sin embargo, para evitar que el signo más unario sea una concatenación cuando se usa en una expresión más grande, necesitarías paréntesis:
blah + (+(function(){ var scope; return "4"; })());
Respuesta #3
Entonces, la respuesta corta es que previene un error de sintaxis, al usar los resultados de la función de una u otra manera.
También puedes indicar al motor que ni siquiera te interesa el valor de retorno utilizando el operador void:
void function() { console.log("Foo!"); }();
Por supuesto, poner llaves alrededor de todo también cumple ese propósito.
