2009-03-30 14 views
16

sto imparando YUI e di tanto in tanto hanno visto questo idioma:JavaScript linguaggio: creare una funzione solo per invocarla

<script> 
    (function x(){ do abcxyz})(); 
</script> 

Perché creare una funzione solo per invocarlo? Perché non basta scrivere:

<script> 
    do abcxyz 
</script> 

Per esempio si veda here.

+0

Vedere anche: http://stackoverflow.com/questions/631187/javascript-scope-and-closure/ –

risposta

44

Stanno approfittando di closures.

Una breve spiegazione: poiché JS utilizza l'ambito a livello di funzione, è possibile eseguire una serie di azioni all'interno di una funzione e mantenerle in tale ambito. Questo è utile per invocare il codice che non interferisce con lo spazio dei nomi globale. Permette anche di creare variabili private: se dichiari una variabile all'interno di una funzione anonima e la esegui immediatamente, solo l'altro codice all'interno della funzione anonima può accedere a tale variabile.

Ad esempio, supponiamo di voler creare un generatore di ID univoco globale. Si potrebbe fare il codice come questo:

var counter = 0; 
var genId = function() 
{ 
    counter = counter + 1; 
    return counter; 
} 

Tuttavia, ora chiunque può pasticciare con contatore, e ora ho inquinato il namespace globale con due variabili (contatore e GenID).

Invece, ho potuto utilizzare una funzione anonima per generare la mia funzione di contatore:

var genId = function() 
{ 
    var counter = 0; 
    var genIdImpl = function() 
    { 
     counter = counter + 1; 
     return counter; 
    } 

    return genIdImpl; 
}(); 

Ora, ho solo una variabile nel namespace globale, che è vantaggioso. Ancora più importante, la variabile contatore è ora al sicuro dall'essere modificata, esiste solo nell'ambito della funzione anonima e quindi solo la funzione genIdImpl (che è stata definita nello stesso ambito) può accedervi.

Sembra nel codice di esempio di YUI, vogliono solo eseguire codice che non inquini affatto lo spazio dei nomi globale.

3

Vogliono evitare le collisioni nello spazio dei nomi, direi. Sembra una buona pratica in JS.

Problemi correlati