Pregunta Signo de JavaScript más delante del nombre de la función


He estado buscando información sobre las funciones de invocación automática, y en algún lugar me encontré con esta notación:

+function(){}

¿Puede alguien explicarme qué + firmar en frente de la función significa / does?


777
2017-11-12 10:06


origen


Respuestas:


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, p. Ej .:

+function() { console.log("Foo!"); }();

Sin el + allí, si el analizador está en un estado donde 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 función declaración en lugar de una función expresión y entonces el () seguirlo (los que están al final de la línea de arriba) sería un error de sintaxis (como lo 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 unario. 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!"); }());

1229
2017-11-12 10:07



Subsidiaria a la respuesta de @TJCrowder, + se usa generalmente para forzar la conversión numérica de un valor como esta respuesta SO explica. En este caso, se llama operador 'unario plus' (para facilitar la búsqueda de Google).

var num = +variant;

Por lo tanto, frente a una función puede ser una forma de forzar el resultado de la función para que se interprete como un número. Dudo que suceda aún, pero teóricamente el JIT podría usar eso para compilar la función como una función de solo números, etc. Sin embargo, para evitar que el más 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"; })());

84
2017-11-12 10:54



Entonces la respuesta corta es que previene 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 está interesado en el valor de retorno utilizando el void operador:

void function() { console.log("Foo!"); }();

Por supuesto, poner llaves en todo esto también sirve para ese propósito.


47
2017-11-16 16:45