¿Ubicación del paréntesis para funciones JavaScript anónimas de ejecución automática?
Recientemente estuve comparando la versión actual de json2.js con la versión que tenía en mi proyecto y noté una diferencia en cómo se creaba y autoejecutaba la expresión de función.
El código utilizado para envolver una función anónima entre paréntesis y luego ejecutarla,
(function () {
// code here
})();
pero ahora envuelve la función ejecutada automáticamente entre paréntesis.
(function () {
// code here
}());
Hay un comentario de CMS en la respuesta aceptada de Explicar la sintaxis de la función anónima encapsulada de JavaScript que dice que "ambos: (function(){})();
y (function(){}());
son válidos".
Me preguntaba ¿cuál es la diferencia? ¿El primero ocupa memoria al dejar una función global y anónima? ¿Dónde debería ubicarse el paréntesis?
Son prácticamente iguales.
El primero envuelve una función entre paréntesis para convertirla en una expresión válida y la invoca. El resultado de la expresión no está definido.
El segundo ejecuta la función y los paréntesis alrededor de la invocación automática la convierten en una expresión válida. También se evalúa como indefinido.
No creo que exista una forma "correcta" de hacerlo, ya que el resultado de la expresión es el mismo.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
En ese caso no importa. Está invocando una expresión que se resuelve en una función en la primera definición y definiendo e invocando inmediatamente una función en el segundo ejemplo. Son similares porque la expresión de la función en el primer ejemplo es solo la definición de la función.
Hay otros casos obviamente más útiles para invocar expresiones que se resuelven en funciones:
(foo || bar)()