2009-04-15 38 views

Respuesta

14

Javascript no tiene un alcance de bloque, por lo que esta es una forma de crear un ámbito local temporal que no contamine el espacio de nombres global. Los paréntesis sirven para dos propósitos:

  1. Algunas implementaciones de javascript se bloquean si faltan.
  2. Señala a los lectores que está sucediendo algo diferente de una declaración de función normal. Entonces, como una convención, señala que esta función se está utilizando como un alcance.

ver aquí: http://peter.michaux.ca/articles/an-important-pair-of-parens

+0

me pegó +1 –

6

En Safari 4, el siguiente código (sin los paréntesis) da como resultado "SyntaxError: Parse error":

function() { alert("Test"); }(); 

... pero funciona el siguiente código como se esperaba:

(function() { alert("Test"); })(); 

actualización: También probé el código en Firefox 3 (a través de Firebug), y se comportaba igual que Safari.

0

Hasta donde yo sé, la única diferencia es que este último a veces no funciona en ciertos sabores de ECMAScript (es decir, ActionScript, pero podría haber otros).

2

La razón

function() { return val;}(); 

que no funciona es porque es una función comunicado, no una expresión . Es una distinción bastante menor, pero básicamente, si la instrucción comienza con function, es como una declaración de función C, y no se puede llamar a la función, porque no hay ningún valor de expresión.

Al agregar los paréntesis, la definición de la función forma parte de una expresión, por lo que tiene un valor y se puede invocar.

La asignación del valor de retorno de la función también elimina la necesidad de paréntesis, porque la definición de la función no es la declaración completa. Por ejemplo, éstas funcionan:

var value = function() { alert("works"); return 0; }(); 
(function() { alert("works"); })(); 

pero esto no significa:

function() { alert("doesn't work"); }(); 

siempre incluyen los paréntesis, incluso cuando no son necesarios, ya que hace que sea más fácil de ver que soy llamando a la función, en lugar de asignarla a una variable.

+0

Absolutamente correcto. También vea aquí: http://yura.thinkweb2.com/named-function-expressions/#expr-vs-decl – user123444555621

Cuestiones relacionadas