Si encuentras alguna incompatibilidad en tu código o proyecto, recuerda probar siempre en un entorno de testing antes subir el código al proyecto final.
Solución:
Cuando la palabra clave function
se cumple en una posición de declaración (como el primer token en una declaración), la declaración de función se expresa como un declaración de función. Las declaraciones de función se elevan a la parte superior del alcance, no se pueden invocar de inmediato y deben tener un nombre.
Cuando la palabra clave se encuentra en una posición de expresión (es decir, no como el primer token en una declaración, en su ejemplo !
es el primer token), la declaración de la función se expresa como un expresión de función, que puede ser anónimo y devuelve el valor de la función recién creada. Dado que devuelve el valor de la función recién creada, puede invocarla inmediatamente agregando un paréntesis después.
Envolver la declaración entre paréntesis hace lo mismo pero es más común que anteponerle un prefijo !
o +
:
(function ()
...
)();
la segunda forma function ()
es un declaración. Él !
operador convierte esto en un expresión. También encontrará casos en los que la gente usa -
o +
antes de function
palabra clave.
Cuando tiene una expresión que evalúa a una función, puede llamar a esa función usando el ()
operador.
Otra forma (quizás más fácil de entender) de lograr el mismo efecto de guardar es con otro conjunto de paréntesis:
( function(x) body; )(arg);
Al colocar la función dentro del paréntesis, la vuelve a convertir en una expresión, que se evalúa como una función. Esta función se llama con arg
como argumento.
Como una función de flecha:
( (x) => body; )(arg);