2013-05-31 8 views
6

Weźmy na przykład ten kod:Czy zakres kończy się, gdy nie są zwracane żadne odwołania?

var test = (function(){ 
    var name = 'rar'; 
    return function foo(){ 
    console.log('test'); 
    }; 
}()); 

foo zostanie zwrócone testbez jakichkolwiek odniesień do name w zakresie wewnętrznej. Co stanie się z name? Czy to jest zniszczone? Czy nadal istnieje i zwisa ze zwróconą funkcją, ale po prostu nie można uzyskać do niej dostępu? Byłby to pierwszy przypadek podobny do prowadzenia następujących, jakby name nigdy nie był częścią równania ?:

var test = function foo(){ 
    console.log('test'); 
}; 

Oto kolejny przypadek:

var test2 = (function(){ 
    var name = 'rar'; 
    var age = '20'; 
    return function foo(){ 
    console.log(age); 
    }; 
}()); 

age pobiera odwołuje foo i będzie stanowić zamknięcie . Jednakże, name nadal nie ma żadnych odniesień. Co dzieje się z name w tym przypadku? Czy to jest zniszczone? Czy nadal istnieje i zwisa ze zwróconą funkcją, ale po prostu nie można uzyskać do niej dostępu?

+2

http://stackoverflow.com/a/864549/2269749 – BlitZ

+0

@CORRUPT Odpowiedzi wydają się wskazywać, że to, co się dzieje, zależy od implementacji. Oznacza to, że w najgorszym przypadku "imię" pozostanie, czy to prawda? – Joseph

+0

Tak. Przeglądarki mają różne silniki JS GC, każdy może działać w tym przypadku inaczej. Rozważ "name = null" jako opcję, aby zapobiec wyciekom pamięci. – BlitZ

Odpowiedz

4

W Chrome, name będzie GCed; w FireFox, name jest przechowywany z całym zamknięciem. TO ZNACZY? Nie wiem

+0

Czy mogę poprosić o odniesienie, dlaczego nazwa "GC" Chrome GC, ale nie w Firefoksie? – Joseph

+0

@JosephtheDreamer Nie mam żadnego odniesienia, moja odpowiedź opiera się wyłącznie na obserwacji podczas pracy z przeglądarkami. –

Powiązane problemy