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 ?

È stato utile?

Soluzione

Da Chiusure JavaScript

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

Chiusure Javascript

  

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

JavaScript, ora per grok chiusure

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.

Ecco una spiegazione grafica.

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:

https://www.youtube.com/watch?v=w1s9PgtEoJs

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top