2010-09-23 11 views
21

Duplicar posibles:
Location of parenthesis for auto-executing anonymous JavaScript functions?Hay una diferencia entre (función() {...}()); y (función() {...})() ;?

veces veo:

(function() { ... }()); 

y, a veces veo:

(function() { ... })(); 

I ver ambas formas con y sin argumentos. Ellos bothexecute la función anónima.

¿Hay alguna diferencia entre las dos formas? ¿Hay alguna razón convincente para usar una forma sobre la otra?

+0

@Tim - Gracias por señalar ese hilo. No lo encontré con la búsqueda. –

+0

Sigamos votando por un duplicado ... –

+2

Josh: La respuesta de CMS es mejor que cualquiera en el duplicado, así que algo bueno ha resultado. –

Respuesta

32

No hay diferencia práctica en esos dos formas, pero a partir de una gramatical punto de vista la diferencia entre los dos es que The Grouping Operator - los paréntesis - llevará a cabo en el primer ejemplo de un CallExpression, que incluye la FunctionExpression:

 
       CallExpression 
       |   | 
     FunctionExpression | 
       |   | 
       V   V 
    (function() {  }()); 
    ^     ^
    |--PrimaryExpression --| 

En el segundo ejemplo, tenemos en primer lugar toda una CallExpression, que ocupa la FunctionExpression:

 
      PrimaryExpression 
       | 
     FunctionExpression 
       | 
       V 
    (function() {  })(); 
    ^     ^
    |-- CallExpression --| 

5

No existe diferencia entre los dos, en lo que se refiere al compilador. Sin embargo, encontrará que el estilo (function() {}()) se recomienda en el código JavaScript code conventions de Douglas Crockford.

+0

Corrección: (función() {}()); – Moses

+1

Como escribió Moses, parece que es al revés.De ese texto: 'Cuando una función debe invocarse inmediatamente, toda la expresión de invocación debe envolverse en parens para que quede claro que el valor que se produce es el resultado de la función y no de la función en sí misma. ... ' (function() {...}()); ' –

+3

Para ser aún más claro, Crockford no (explícitamente) recomienda ninguna forma en ese enlace. Lo único relacionado que Crockford recomienda es envolver las funciones autoejecutables en parens. – Moses

2

En cuanto a las diferencias, en realidad es solo azúcar sintáctico. Algo equivalente a: "¿te gusta jQuery() o $()?" Ambos se pueden compilar, ejecutar y usar indistintamente (AFAIK).

A partir de los ejemplos de código que he visto hasta el momento, más personas parecen seguir el código de convenciones Crockford:

(function() { ... }()); 

Personalmente, prefiero la convención (function(){})(); porque es más evidente para mí que la función es auto -executing; También soy un gran usuario de jQuery y esa es la convención utilizada en jQuery source.

Además, se considera una buena práctica utilizar paréntesis para encerrar su función autoejecutable, independientemente de la forma que elija.

+0

¿Hay alguna fuente para la "convención predominante"? –

+0

@Casey - Crockford lo menciona en sus [** convenciones de códigos **] (http://javascript.crockford.com/code.html) - [Mozilla] (https://developer.mozilla.org/es/JavaScript_style_guide) y [Drupal] (http://drupal.org/node/172169) las convenciones no parecen mencionarlo de ninguna manera. –

Cuestiones relacionadas