2015-03-24 14 views
8

Jak następujących kodów:Gdzie są zmienne w zamknięciu przechowywane - stos lub sterty?

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

Kiedy wychodzi Foo (lub powiedzieć, zwrotów), wiemy, że zmienną nie zostanie zniszczony i pozostaje w pamięci (dlatego zamknięcie działa). Więc moim problemem jest, gdzie jest zmienna sklep, stos lub sterty?

Odpowiedz

15

Zamknięcie to tylko ewolucja koncepcji stosu.

Stos jest używany do oddzielania/izolowania zasięgu, gdy są wywoływane funkcje. Gdy funkcja zwraca ramkę stosu (rekord aktywacji) jest usuwany z stosu wywołań, uwalniając w ten sposób pamięć używaną, umożliwiając następnemu wywołaniu funkcji ponowne użycie tej pamięci RAM dla jej ramki stosu.

To, co robi zamknięcie, polega na tym, że zamiast faktycznie zwalniać ramkę stosu, jeśli w ramce stosu znajduje się jakikolwiek obiekt/zmienna, do której odwołuje się cokolwiek innego, to zachowuje ramkę stosu do przyszłego użytku.

Większość języków implementuje to poprzez implementowanie stosu jako tabeli połączonej lub tabeli mieszania zamiast płaskiej tablicy. W ten sposób stos może zostać ponownie zamówiony w czasie wykonywania i nie jest ograniczony przez fizyczny układ pamięci.

So. Mając to na uwadze, odpowiedź jest taka, że ​​zmienne w zamknięciu są przechowywane w stosie i stercie. W zależności od twojego punktu widzenia.

Z punktu widzenia języka, zdecydowanie jest to stos. Ponieważ to są zamknięcia w teorii - zmodyfikowany stos.

Z punktu widzenia języka maszyny lub leżącego u jego podstaw kodu C/złożenia, idea stosu połączonych list jest nonsensem. Dlatego język wyższego poziomu musi używać sterty, aby zaimplementować jej "stos".

Więc zmienna jest w stosie, ale ten stos prawdopodobnie znajduje się w stercie.

To oczywiście zależy od implementacji języka programowania. Ale powyższy opis jest ważny dla większości tłumaczy javascript (z pewnością tych wszystkich, których widziałem).

+0

Zobacz, jak działa mechanizm zamknięcia na poziomie pamięci: http: //stackoverflow.com/questions/26061856/javascript-cant-access-private-properties/26063201#26063201 – slebetman

Powiązane problemy