2010-08-31 7 views

Respuesta

5

Lo he visto a menudo recientemente. Supongo que:

No hay necesidad de nombrar la función. Implica que no es reutilizable. Esto le da un alcance local para declarar variables usando var (de lo contrario, las agregaría a global).

0

Es un closure y anonymous function - conceptos clave en Javascript. Javascript no tiene propiedades o campos privados "verdaderos", pero con un cierre puede crear esencialmente el equivalente. Son un medio muy importante de organizar JS.

Un punto crítico en esta muestra es la (); al final del código - la adición de estos paréntesis indica Javascript para ejecutar el código inmediatamente - inicializar efectivamente todo lo que se encuentra dentro.

http://www.jibbering.com/faq/notes/closures/


para ayudar a aclarar (no soy un experto JS) - esta construcción, aunque no sea un cierre puro, que se ve con frecuencia en combinación con cierres. Por ejemplo, el siguiente fragmento de código (copiada de mi enlace anterior) utiliza esta sintaxis para definir un método interno, oculto:

function callLater(paramA, paramB, paramC){ 
    /* Return a reference to an anonymous inner function created 
     with a function expression:- 
    */ 
    return (function(){ 
     /* This inner function is to be executed with - setTimeout 
      - and when it is executed it can read, and act upon, the 
      parameters passed to the outer function:- 
     */ 
     paramA[paramB] = paramC; 
    }); 
} 

... 

/* Call the function that will return a reference to the inner function 
    object created in its execution context. Passing the parameters that 
    the inner function will use when it is eventually executed as 
    arguments to the outer function. The returned reference to the inner 
    function object is assigned to a local variable:- 
*/ 
var functRef = callLater(elStyle, "display", "none"); 
/* Call the setTimeout function, passing the reference to the inner 
    function assigned to the - functRef - variable as the first argument:- 
*/ 
hideMenu=setTimeout(functRef, 500); 

Aunque: este ejemplo no ejecutar inmediatamente (que carece de la ();) después la definición de la función interna. Entonces, en este caso, la función adjunta se evalúa en un momento posterior - esos () hacen una gran diferencia en un lenguaje funcional.

+0

Un cierre, como dijiste, es un concepto clave en JavaScript. Pero es esencialmente para mantener o evitar referencias a variables que pertenecen al contexto de ejecución de la función que accede a ellas. Lo que sucede aquí es que no hay variables, y que no es el objetivo de la pregunta después de todo. No estoy haciendo accesible ninguna variable fuera de su contexto original. Entonces ... ¿Dónde hay cierres aquí? Vi que cabía un voto negativo ("La respuesta no es útil"). Si quieres, puedo sacarlo, pero tu respuesta tiene poco en común con el resto. – DanC

+0

"no hay variables". - no hay nada dentro del ejemplo, presumo que el caso que usted estaba examinando probablemente contenía miembros tales como variables y otras funciones, lo que hace que esto actúe como un cierre. Es algo que rara vez he visto para scripting/procedural Javascript simple – STW

+0

Lo siento STW, no quise ser grosero, pero, ¿viste las otras respuestas? Puedes discutir durante todo el día, pero en este punto parece claro lo que he preguntado (teniendo en cuenta todas las otras respuestas), y tu respuesta simplemente no encajaba. De hecho, este fue un duplicado exacto de otra pregunta que no pude encontrar. Gracias de todos modos por responder, pero su respuesta puede ser más adecuada para otra pregunta, tal vez sobre cierres. Además, su respuesta parece haber cambiado mucho desde la original. – DanC

0

Se utiliza para ejecutar un código FUERA del alcance global. Con esto, está utilizando el alcance de la función. En este caso, el alcance de una función anónima.

Esto es útil cuando no quiere crear vars globales, por ejemplo.

Ver:

var b = 2; 
(function(){ 
    var a=1; 
    alert("a:" + a); // alerts 1 
    alert("b:" + b); // alerts 2 
})(); 
alert("OUT b:" + b); // alerts 2 
alert("OUT a:" + a); // undefined 

Véase en jsfiddle.


EDIT:

La sintaxis ()() es otra forma de llamar a una función. Ver

alert(1); // alerts 1 
(alert)(2); // alerts 2 

Véase en jsfiddle.

+0

Gracias por la edición de la técnica de llamada alternativa()() ... ¡Nunca pude encontrar en ninguna parte que simplemente lo dijera simplemente! – exoboy

0

Es una manera de definir una función y llamarla inmediatamente. eso es lo último(); hace.

Cuestiones relacionadas