2012-06-21 24 views
10

He visto un código Javascript que usa paréntesis inmediatamente después de cerrar la llave de cierre de una función, no puedo entender para qué se usan.¿Qué significa paréntesis después de las llaves?

Ejemplo:

function foo(bar){ 
    return bar; 
}(0); 
  • ¿Qué (0) hacer?

  • ¿Cómo se llama esto?

  • ¿Cuándo debe usar esta técnica?

+2

Si acaba de proporcionar un mal ejemplo, entonces la pregunta es un duplicado de (http [¿Qué paréntesis que rodean una función/declaración de objeto JavaScript/clase significan?]: //stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-object-function-class-declaration-m). –

Respuesta

9

En su ejemplo, sólo tiene dos estados y es equivalente a:

function foo(bar){ 
    return bar; 
} 
0; 

Esto es no una función autoinvocada. La primera declaración es una declaración de función , la segunda instrucción es simplemente el número literal 0, que no hace nada. Los paréntesis no ejecutan la función, son grouping operator.

¿Cómo podemos probar esto? Pruebe:

function foo(bar){ 
    return "bar"; 
}(0); 

y dígame cuál es el resultado.


que sería una función de auto-invocando, si tuviéramos una expresión función. Para eso puede usar el operador de agrupación para forzar que se evalúe como expresión.

Por ejemplo:

(function foo(bar){ 
    return bar; 
})(0); 

Esta es una expresión de la función llamada. El resultado de la expresión ((function ....)) es una referencia de función y (0) ejecuta la función, pasando 0 como argumento.

La posición del paréntesis también podría ser:

(function foo(bar){ 
    return bar; 
}(0)); 

Tal vez esto es lo que han visto.

Esta técnica fue ya ampliamente discutido aquí: What is the purpose of a self executing function in javascript?

+0

Gracias Félix, debes tener ojos de águila :) – jon

11

Invocan de inmediato la función similar a cuando se llama a una función:

function foo() { 
    alert('hello'); 
} 

foo(); // call 

Usted también puede llamar directamente:

(function foo(){ 
    alert('hello'); 
})(); // <-------------- 

Actualmente tiene Function Declaration . Para realidad sí lo invocan, es necesario tener así en paréntesis (para que sea una expresión):

(function foo(bar){ 
    return bar; 
})(0); 

y ahora es Function Expression e invocará inmediatamente. Para conocer la diferencia entre Function Declaration y Function Expression, echa un vistazo a este excelente artículo de Kangax:


Lo que sí (0) hacer?

Es argumento pasado a la función de modo foobar sería 0 función dentro.

¿Cómo se llama esto?

Es una función de autoentrada o autoejecutable. También es posible que desee ver this.

¿Cuándo utilizar esta técnica?

Cuando desea invocar una función directamente y mantener el alcance variable dentro de esa expresión de función solamente. No estará disponible para el mundo exterior o más bien el código fuera de esa expresión de función.


obtener más información:

+0

Consejo: '(function (...) {...}) (...);' funciona siempre, incluso con funciones anónimas, donde el valor de retorno no está asignado a var –

+0

Esto no es correcto desafortunadamente . Ver mi respuesta Pero tal vez el OP solo dio un mal ejemplo. –

+0

@FelixKling: +1 a usted. Pasé por alto la sintaxis del OP, agregué más detalles. – Sarfraz

0

Esta es una función de auto invocación. Usted pasa 0 como un parámetro. bar lo tanto, su función estará regresando el cual es igual a 0.

Por ejemplo, la función de abajo es el equivalente:

function foo(bar) { 
    return bar; 
} 

foo(0); // returns 0 
Cuestiones relacionadas