2012-06-08 11 views
10

Esiste un motivo per utilizzare una funzione di auto-chiamata con il ?Named Self Invoking Function

Ad esempio:

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

quanto riguarda la mia formazione mi ha portato, questo comporta allo stesso come una funzione di auto invocazione anonima, senza vantaggi aggiuntivi (non si può chiamare di nuovo dopo l'invocazione) e senza ulteriori svantaggi in quanto non "inquina" la portata globale (credo).

Ci sono delle volte in cui avrebbe senso nominare una funzione auto-invocante come quella sopra?

+1

È un'espressione di funzione denominata, quindi vengono applicati tutti i motivi per l'utilizzo di espressioni di funzione con nome. –

+3

L'esempio canonico è ricorsione: '(funzione fib (n) {return n <= 2? N-1: fib (n-1) + fib (n-2);}) (7)' – davin

+0

Forse perché il codice all'interno usa il nome della funzione? – MaxArt

risposta

10

Se avete bisogno di una funzione di auto-invocazione ricorsiva allora può avere senso:

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

Demo: http://jsfiddle.net/9xrvB/ Non l'ho mai visto prima. –

+0

E a proposito, con il combinatore Y potrebbe essere raggiunto senza nominare una funzione. – penartur

+0

@penartur - Hai una demo? –

5

io uso questo modello per i dati elettorali dai server periodicamente. Ciò rende il codice meno ingombrante (in particolare la linea setTimeout).

+0

amorevole, grazie! – Dogoku

3

Sarebbe utile per la ricorsione, ma per il momento è necessario evitare le espressioni di funzione denominate. Essi non sono supportati correttamente in Internet Explorer fino alla versione 9.

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

"IE < 9 non supporta NFE"

+0

Non dice "non supportato", dice "non implementato correttamente". Se conosci le stranezze e sai che non ti influenza molto (il che è il più delle volte), puoi comunque usarle senza bloccare IE. Da leggere sull'argomento: http://kangax.github.io/nfe/#jscript-bugs – Bergi

+0

@Bergi: non ho detto "non supportato", ho detto "non supportato correttamente". Se si desidera dividere i suoni, qui è ovviamente una differenza tra supportato e implementato, ma che non è implementato correttamente ha l'effetto che non è supportato correttamente. – Guffa

+0

Il mio fraseggio in inglese è troppo male per dividere i suoni in ogni caso, mi spiace: -/Ma non intendevo quello che hai detto, ma quella citazione che hai dato. – Bergi

0

Naming funzioni di auto-invocato può aumentare la leggibilità. Ad esempio, nel caso in cui si stiano creando più chiusure tramite funzioni auto-invocate, fornendo nomi aumenta la leggibilità del codice senza alcun danno (a parte il fatto di perdere il supporto di IE vecchio, come notato). In pratica, si stanno creando blocchi di codice nominati, che può essere un bel modo per rompere una grande funzione.

esempio,

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

IeFE sembrano essere eccessivi per questo. Usali solo se hai * bisogno * delle chiusure (per la raccolta di ambiti/garbage collection), per qualsiasi altro commento (e magari [blocchi] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Dichiarazioni/blocco)) sarà sufficiente. – Bergi

+1

@Ben Roberts Hai mai sentito parlare di etichette JavaScript? –

0

Si può usare per l'inizializzazione, la riga di codice che si deve eseguire prima e poi si chiamerà un altro script.