2012-06-08 17 views
10

¿Alguna vez hay una razón para usar una denominada función de invocación automática?Función de auto invocación con nombre

Por ejemplo:

(function foo() 
{ 
    alert('Hello World! Named Self Invoking Function Here'); 
})(); 

En lo que a mi aprendizaje me ha llevado, esto actúa igual que una función de auto invocación anónima, sin ventajas adicionales (no se puede llamar de nuevo después de la invocación) , y sin inconvenientes adicionales, ya que no "contamina" el alcance global (creo).

¿Hay algún momento en que tendría sentido nombrar una función de invocación automática como la anterior?

+1

Es una expresión de función nombrada, por lo que se aplican los motivos para usar expresiones de funciones con nombre. –

+3

El ejemplo canónico es recursividad: '(función fib (n) {return n <= 2? N-1: fib (n-1) + fib (n-2);}) (7)' – davin

+0

Tal vez porque el código adentro hace uso del nombre de la función? – MaxArt

Respuesta

10

Si necesita una función de auto-invocación recursiva a continuación, puede tener sentido:

(function loop(i) { 
    console.log(i); 
    i++; 
    if(i < 10) { 
     loop(i); 
    } 
})(0); 
+0

Demostración: http://jsfiddle.net/9xrvB/ No he visto eso antes. –

+0

Y, por cierto, con el combinador Y se podría lograr sin nombrar una función. – penartur

+0

@penartur - ¿Tienes una demostración? –

5

utilizo este patrón de datos de las encuestas de los servidores de forma periódica. Esto hace que el código sea menos desordenado (especialmente la línea setTimeout).

(function poll() { 
    $.get("/somedata", function (data) { 
    // Processing data... 
    setTimeout(poll, 1000); 
    }); 
})(); 
+0

amando esto, ¡gracias! – Dogoku

3

Sería útil para la recursión, pero debe evitar las expresiones de funciones nombradas por el momento. Ellos no son compatibles correctamente en Internet Explorer hasta la versión 9.

Ver: http://javascript.info/tutorial/functions-declarations-and-expressions

"IE 9 < no soporta la ENF"

+0

No dice "no compatible", dice "no implementado correctamente". Si conoces las peculiaridades y sabes que realmente no te afecta (que es principalmente el caso), puedes usarlas sin fallar el IE. Debe leer sobre el tema: http://kangax.github.io/nfe/#jscript-bugs – Bergi

+0

@Bergi: No dije "no compatible", dije "no compatible". Si desea dividir escuchas, aquí hay, por supuesto, una diferencia entre compatible e implementado, pero que no se implementa correctamente tiene el efecto de que no se admite correctamente. – Guffa

+0

Mi fraseología en inglés es muy mala para dividir escucha de todos modos, lo siento: -/Pero no quise decir lo que dijiste, pero esa cita la diste. – Bergi

0

Naming funciones de auto-invocado puede aumentar la legibilidad. Por ejemplo, en el caso de que esté creando varios cierres a través de funciones autoinvocadas, al proporcionar nombres aumenta la legibilidad del código sin daño (aparte de perder compatibilidad con IE anterior, como se señaló). En esencia, está creando bloques de código con nombre, que puede ser una buena forma de romper una función grande.

por ejemplo,

function bigFunction() { 
    (function doTheFirstThing() { 
     //code here. 
    })(); 
    (function doTheSecondThing() { 
    //code here. 
    })(); 
} 
+0

IEFE parece ser excesivo para eso. Úselos solo si * necesita * los cierres (para el alcance/recolección de basura), para cualquier otro comentario (y tal vez [bloques] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)/Declaraciones/bloque)) será suficiente. – Bergi

+1

@Ben Roberts ¿Has oído hablar alguna vez de las etiquetas JavaScript? –

0

Se puede utilizar para la inicialización, la línea de código que tiene que ejecutar primero y luego se va a llamar a otro guión.

Cuestiones relacionadas