Chyba brakuje mi bardzo ważną rzeczą javascriptCo dzieje się z lokalnymi funkcjami, do których odwołuje się zdarzenie w JavaScript?
var gl = 10
$(document).ready(function() {
var obj = {}
obj.test = function() {
gl++
var lc = gl
function y() {
alert('local = ' + lc)
}
(function() {
var k = lc + 1
$('#button').click(function() {
alert('local anonymous = ' + k)
y()
})
})();
}
obj.test()
$('#button').off()
obj.test()
})
W scenariuszu powyżej mam zdefiniowany przedmiot „obj” i stworzył metodę „test” dla tego obiektu. Wewnątrz metody mam lokalną funkcję "y()", która jest używana przez zdarzenie "kliknięcie" dołączone do przycisku. Również zdarzenie click jest dołączane w funkcji anonimowej.
Następnie dzwonię "test()", anuluję subskrypcję zdarzenia "kliknięcie" z przycisku i ponownie wywołuję "test()". W rezultacie otrzymuję lokalny = 12 i lokalny anonimowy = 13, który jest oczekiwany.
Jednak nie rozumiem, co javascript ma w pamięci, szczególnie do funkcji "y()" i anonimowej funkcji w każdym z tych kroków.
Moje szczegółowe pytania znajdują się poniżej, ale byłbym bardzo wdzięczny, jeśli potrafisz wyjaśnić cały proces.
Po detekcji zdarzeń odnoszących się do pierwszego "obj.test()". W tym przypadku myślę, że to tylko wydarzenie typu "kliknięcie". Czy javascript zniszczy zakres obj.test() i wszystkie funkcje, w tym anonimowy zakres funkcji? Czy muszę dbać o coś innego?
Mój przypadek użycia: Tworzę dynamiczne ładowanie stron z różnymi zachowaniami strony, dlatego chciałem oddzielić javascript dla każdej strony w metodach obiektów globalnych i po załadowaniu nowej strony chciałem odłączyć wszystkie zdarzenia dla poprzednią stronę i wywołaj funkcję zachowania. Ale nagle uświadomiłem sobie, że tak naprawdę nie rozumiem, jak działa javascript i potencjalnie mogą być naprawdę olbrzymie wycieki pamięci w tym podejściu. : -)
Wielkie dzięki!
Może to być pomocne w wyjaśnieniu, jak/dlaczego to działa: [Zamknięcia JavaScript] (http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) ... – War10ck