2012-02-29 9 views
6

quizás una pregunta tonta.Sintaxis de la función autoejecutable y sintaxis de devolución de llamada explicada

Pero quiero entender por qué la sintaxis de la función automática y la devolución de llamada que tiene es tan diferente a todo el resto de la sintaxis de JS ..

(function() { 
})() 

sólo hay que entender por qué su válida para encapsularlo con () No habría supuesto que es válido, y luego el extra () después de la devolución de llamada, (que simplemente se sienta directamente después de él, tampoco habría esperado que sea válido.

Es ¿alguien capaz de explicarme esto?

+0

posible duplicado de [¿Cómo funciona una función anónima en JavaScript?] (Http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work) – ziesemer

+0

Una manera alternativa de hacer lo mismo, que evita todos los paréntesis, es 'new function() {...};'. New invoca la función para usted. – jpsimons

+0

@darkporter: Una diferencia importante es que 'new function() {...}' invoca la función * como un constructor *. Entonces 'this' será diferente en el interior, y la expresión evaluará el objeto recién creado en lugar de lo que' function() {...} 'devuelve. (Supongo que ya sabes esto, pero creo que vale la pena hacerlo explícito para el beneficio de aquellos que no lo hacen!) – ruakh

Respuesta

14

La parte function (...) {...} es una expresión de función , es decir, una expresión que representa una función. La única razón por la que debe estar entre paréntesis en este caso es que si la palabra clave function es lo primero en una declaración, entonces se asume que la declaración es una declaración de función , es decir, una declaración de función. (En realidad, no necesariamente tiene que estar envuelto en paréntesis, sino que también trabaja para prefijo una +, o en general para poner cualquier tipo de prenda antes function que impide la interpretación función comunicado.)

El () parte después de que la expresión de la función sea la misma que la normal () para llamar a una función. Este:

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

es (aparte de la variable temporal) lo mismo que esto:

var f = function (...) {...}; 
f(); 

que es equivalente a esto:

function f(...) {...}; 
f(); 
+0

Gracias a todos, gracias ruakh. Tengo lo que estás diciendo. Creo que la joroba es comprender las 3 formas en que una función puede ser declarada. – Baconbeastnz

2

Esencialmente los paréntesis exteriores permiten que el objeto de función para ser interpretado e instanciado completamente, de modo que una vez que salga del alcance de esos paréntesis, el objeto de función esté listo para ser llamado.

2

Ver aquí:

Al declarar como lo hizo, que lo está utilizando como una expresión de función (tercera forma de definir la función desde el siguiente enlace). Al igual que con cualquier expresión, este (expression) evalúa la expresión; los paréntesis se utilizan aquí; se establece la precedencia cuando sea necesario. Para que pueda escribir esto, por ejemplo:

var f = function(a) { 
    var s = ((((1)))) + ((((a)))); 
    console.log(s); 
}; 

(((((f))))) (2); 

(live example) y luego eliminar todos los paréntesis innecesarios con el mismo resultado (que es la impresión de 1 + 2 = 3, esencialmente). El resultado de:

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

es una función que acepta algunos argumentos y tiene un cuerpo para ejecutarse.Este:

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

es más o menos equivalente a:

var f = (function(...) { ... }); 
// Now f is a function that can be called 
f(); 

funciones anónimas son útiles, entre otras cosas, por dos razones - que son anónimas (es decir, que no crean nuevos nombres - ver otra vez el enlace SOQ anterior) y son "contenedores" para otras cosas que no necesitan ser globales.

0

Lo que tiene aquí es una expresión de función Invocada Inmediatamente también conocida como IFFE (lectura dudosa) y es un patrón de diseño que produce alcance léxico utilizando el ámbito de funciones JS. Estos se utilizan para evitar el izado variable, contaminando el medio ambiente global y, al mismo tiempo, permitiendo el acceso público a los métodos al tiempo que se conserva la privacidad local de las variables declaradas dentro de la función. La clave para entender esto es que JS tiene alcance de función y no bloquea el alcance y pasa valores por referencia dentro de un cierre. Puede leer más al respecto al Immediately-invoked function expression.

Cuestiones relacionadas