2015-03-24 16 views
8

Come i seguenti codici:Dove sono memorizzate le variabili in una chiusura: stack o heap?

var foo = function() { 
    var a = 1; // closure var 
    return function() { // closure fun 
     console.log(a); 
    } 
}; 
var bar = foo(); 

Quando uscite Foo (o dire, resi), sappiamo che la variabile a non saranno distrutti e rimane in memoria (è per questo che la chiusura funziona). Quindi il mio problema è dove la variabile è un negozio, stack o heap?

risposta

15

Una chiusura è solo un'evoluzione del concetto di stack.

Lo stack viene utilizzato per separare/isolare l'ambito quando vengono chiamate le funzioni. Quando una funzione ritorna, la pila di frame (record di attivazione) viene eliminata dallo stack di chiamate liberando così la memoria utilizzata permettendo alla prossima chiamata di funzione di riutilizzare quella RAM per il suo stack frame.

Ciò che una chiusura fa è che invece di liberare quel frame di stack, se c'è qualche oggetto/variabile in quel frame di stack a cui fa riferimento qualsiasi altra cosa, mantiene lo stack frame per un uso futuro.

La maggior parte delle lingue implementa questo implementando lo stack come elenco collegato o tabella hash invece di un array piatto. In questo modo, lo stack può essere riordinato in fase di runtime e non è vincolato dal layout della memoria fisica.

Così. Con questo in mente, la risposta è che le variabili in una chiusura sono memorizzate nello stack e nell'heap. A seconda del tuo punto di vista.

Dal punto di vista della lingua, è sicuramente lo stack. Poiché questo è ciò che le chiusure sono in teoria - una pila modificata.

Dal punto di vista del linguaggio macchina o del codice C/assembly sottostante, l'idea di uno stack di elenchi collegati non ha senso. Pertanto il linguaggio di livello superiore deve utilizzare l'heap per implementare il suo "stack".

Quindi la variabile è nello stack ma quella pila si trova probabilmente nell'heap.

Questo ovviamente dipende dall'implementazione del tuo linguaggio di programmazione. Ma la descrizione sopra è valida per la maggior parte degli interpreti javascript (sicuramente tutti quelli che ho visto).

+0

Vedere questo per una descrizione di come funziona il meccanismo di chiusura a livello di memoria: http: //stackoverflow.com/questions/26061856/javascript-cant-access-private-properties/26063201#26063201 – slebetman

Problemi correlati