Che cosa fa esattamente & # 8220; chiusura & # 8221; fare riferimento a JavaScript?
-
05-07-2019 - |
Domanda
Capisco cosa sono le chiusure, ma ho qualche problema nel grokking esattamente a cosa si riferisce il termine chiusura
. Ho visto il termine usato in molti siti Web, ma raramente concordano sulla sua effettiva definizione.
- Sono le variabili che vengono mantenute nel frame dello stack?
- È la funzione che viene restituita?
- È lo scopo della funzione esterna?
- È lo scopo della funzione interna (restituita)?
- È forse il concetto di mantenere le variabili nello stack-frame dopo aver restituito la funzione?
Qualcuno può dirmi esattamente a cosa si riferisce chiusura
?
Soluzione
Due riassunti di una frase:
Una chiusura sono le variabili locali per a funzione - mantenuta in vita dopo il è tornata la funzione, oppure
Una chiusura è uno stack-frame che è non deallocato quando la funzione ritorna. (come se fosse un "stack-frame" malloc invece di essere sul impilare!)
Un ottimo articolo sulle chiusure
A "chiusura" è un'espressione (in genere una funzione) che può avere variabili libere insieme a un ambiente che lega tali variabili (che "chiude" l'espressione).
La semplice spiegazione di una Chiusura è che ECMAScript consente a inner funzioni; definizioni delle funzioni e espressioni di funzione che sono dentro i corpi funzione di altre funzioni. E che quelle funzioni interne lo sono permesso l'accesso a tutto il locale variabili, parametri e dichiarati funzioni interne nel loro esterno funzione (s). Una chiusura si forma quando viene creata una di quelle funzioni interne accessibile al di fuori della funzione in che era contenuto, in modo che potesse essere eseguito dopo la funzione esterna è tornato. A quel punto ancora ha accesso alle variabili locali, parametri e funzione interna dichiarazioni della sua funzione esterna. Quelle variabili locali, parametro e dichiarazioni di funzione (inizialmente) hanno i valori che avevano quando il funzione esterna restituita e può essere interagito con la funzione interna.
Un buon esempio qui
Altri suggerimenti
È una funzione che " detiene " un riferimento o riferimenti a qualcosa in un altro ambito. Ad esempio:
var myArrayOfFunctions = [];
for(var i = 0; i<3: i++)
{
//Note how the function being defined uses i,
//where i lives in the parent's scope, this creates a closure
myArrayOfFunctions[i] = function(a) { return a + i;}
}
myArrayOfFunctions[0](5); //Prints 8 WTF!
myArrayOfFunctions[1](5); //8 again
myArrayOfFunctions[2](5); //Well, this 8 was expected
Ciò accade perché quando le funzioni sono "create", non copiano il valore di i, contengono un riferimento a i, quindi quando chiamiamo le funzioni usano il valore corrente di i che è 3.
Per me, le chiusure in JS ti permettono di fare quanto segue.
& Quot; un " rimane disponibile nella funzione interna quando aggiunto a "b" sebbene sia dichiarato all'esterno.
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
Per un uso estremo delle chiusure JS, puoi dare un'occhiata a codice sorgente della libreria PURE (un motore di template JS)
Per quanto ne so, una chiusura è una funzione definita all'interno di un'altra funzione che sopravvive all'ambito della funzione genitore. Un esempio comune sono i callback:
function delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
In questo caso, la precedente chiusura della funzione
è definita all'interno del corpo di delay_message
, ma la definizione della funzione e la variabile della funzione genitore msg
- sopravvive all'ambito della chiamata alla funzione delay_message
.
Considera il codice seguente che crea una chiusura con le variabili aeb
closure=(function(){
var a=3
var b=5
return function(operation){
return operation(a,b)
}
}())
// The variables a and b are now part of the closure (They are retained even after the outer function returns)
closure(function(x,y){return x+y}) // outputs 8
closure(function(x,y){return x*y}) // outputs 15`
Questa particolare chiusura ora può assumere qualsiasi funzione che opera sulle variabili aeb
Essenzialmente una chiusura è un corpo di funzione chiuso sui suoi identificatori (variabili) all'interno del suo ambiente locale.
Una chiusura è un valore di funzione creato da una dichiarazione di funzione nidificata o espressione di funzione (cioè espressione lambda) il cui corpo contiene uno o più riferimenti a variabili dichiarate in un ambito esterno (ma non globale).
Chiusura indica una funzione (funzione esterna) contenente un'altra funzione (funzione interna).
La chiusura viene utilizzata per proteggere i dati.
l'uso di Closer è dimostrato nel collegamento video fornito di seguito: