Il punto è che tutte le variabili dichiarate nelle cose interessanti non verranno create nello spazio dei nomi globale. Qualsiasi funzione in javascript creerà un tale ambito. Supponiamo di avere qualche javascript che vuoi eseguire. Se si esegue questa operazione:
var b = 1;
// stuff using b
E qualche altro codice utilizza b, che avrà il suo valore di sinistra sopra. (O, peggio ancora, se qualche altro codice imposta b prima dell'esecuzione del codice, quindi cerca di ottenere il suo vecchio valore in seguito, lo avresti cambiato nel frattempo.)
D'altra parte, se si dispone di questo codice, che dichiara e poi chiama la funzione:
function a() {
var b = 1;
}
a();
e qualche altro codice utilizza in seguito b, non vedrà i propri valori, in quanto b è locale alla funzione. Il problema con questo, ovviamente, è che stai ancora facendo un nome globale - "a", in questo caso. Quindi, vogliamo una funzione senza nome: ecco perché ottieni il codice che hai descritto. Dichiara una funzione senza nome e quindi la chiama.
Purtroppo, non si può solo dire:
function() { ... }()
perché questo sarà analizzato come una dichiarazione di funzione dichiarazione, e poi un errore di sintassi. Inserendo la dichiarazione della funzione tra parentesi, si ottiene una funzione espressione, che può quindi essere richiamata. Lo chiami come qualsiasi altra espressione di funzione (come a, sopra), usando il secondo set di parents. Ad esempio, se la funzione ha assunto argomenti, li passeresti lì:
(function(a) { ... })(1)
Tranne, ovviamente, che sia in conflitto con il nome della vostra funzione. –
Uh, si. Ecco perché è normalmente fatto con una funzione anonima. Ho appena usato una funzione con nome per mostrare una forma più familiare che fa la stessa cosa. –
jder ha la risposta migliore, per quelli che arrivano in ritardo alla festa. – Triptych