Lo ()
che avvolge la funzione trasforma la dichiarazione di funzione anonima in un'espressione di funzione che può quindi essere richiamata immediatamente con ()
che segue l'espressione.
In questo caso, l'esterno ()
non è realmente necessario poiché lo var foo =
lo trasformerebbe in un'espressione. Inoltre, il valore di foo
sarà undefined
poiché l'invocazione della funzione non restituisce nulla.
Può essere utilizzato per creare un nuovo scope variabile, poiché una funzione è l'unico modo per ottenerlo in javascript. (Javascript non ha un ambito di blocco.)
Quindi la variabile someVar
non è accessibile per l'ambito esterno. Ci possono essere momenti in cui è desiderabile renderlo accessibile in modo controllato. Per fare ciò, è possibile passare una funzione fuori da tale ambito che fa riferimento a someVar
. Quindi, una volta terminata l'invocazione della funzione, il relativo contesto di esecuzione rimarrà intatto e someVar
sarà disponibile in qualsiasi modo la funzione che è stata distribuita.
Si chiama creando closure
.
Supponiamo di aver passato un valore nell'invocazione e assegnato a someVar
. È quindi possibile eseguire la funzione return
dal richiamo alla variabile foo
. Se la funzione restituisce i riferimenti someVar
, è possibile utilizzare tale funzione per ottenere il relativo valore.
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function() {
alert(someVar);
};
})('somevalue');
foo(); // alerts 'somevalue'
Come si può vedere, la funzione ora fa riferimento foo
può comunque accedere someVar
.
Supponiamo di averlo modificato in modo che la funzione restituita a foo
possa accettare un argomento, che aggiornerà il valore di myVar
.
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function(n) {
if(n) {
someVar = n;
} else {
alert(someVar);
}
};
})('somevalue');
foo(); // alerts 'somevalue'
foo('newvalue'); // give it a new value
foo(); // alerts 'newvalue'
ora si può vedere, che la funzione in foo
realmente accedere a tale variabile, in quanto è in grado di cambiare il suo valore, e fare riferimento il nuovo valore che precedentemente impostato.
Anche http://stackoverflow.com/questions/4531110/jquerys-function-jquery-syntax/4531124#4531124 –
Questo non è un duplicato esatto, poiché richiede il caso più generale, non il caso specifico di jQuery - che è un analogo di questo. – Orbling
@Orbling Sì, ma le risposte in entrambe le domande non sono specifiche per jquery. –