¿Ubicación del paréntesis para funciones JavaScript anónimas de ejecución automática?

Resuelto Kevin Hakanson asked hace 14 años • 4 respuestas

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?

Kevin Hakanson avatar Aug 02 '10 08:08 Kevin Hakanson
Aceptado

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"
meder omuraliev avatar Aug 02 '2010 01:08 meder omuraliev

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)()
Kenan Banks avatar Aug 02 '2010 01:08 Kenan Banks