function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
Powyższy przykład pokazuje klasyczne, przypadkowe (lub może nie) wyciek pamięci. Śmieciarka V8 nie może określić, czy można bezpiecznie usunąć bigObject
, ponieważ jest on używany w funkcji wywołania zwrotnego, które można wywołać kilka razy.Brak wycieku pamięci wywołania zwrotnego w javascript
Jednym rozwiązaniem jest ustawienie bigObject
na null
, gdy zadanie w funkcji wywołania zwrotnego się zakończy. Ale jeśli używasz wielu zmiennych (wyobraź sobie, że istnieją n
zmienne takie jak bigObject
i wszystkie są używane w oddzwanianiu), to czyszczenie tego staje się brzydkim problemem.
Moje pytanie brzmi: czy istnieje inny sposób czyszczenia tych używanych zmiennych?
EDYTOWANIE Oto kolejny przykład (rzeczywisty świat): Dostaję więc aplikację od mongodb i porównuję ją z inną aplikacją. Oddzwonienie z mongodb wykorzystuje zmienną aplikację, która jest zdefiniowana z tego wywołania zwrotnego. Po otrzymaniu wyniku od mongodb zwracam go również jako callback (ponieważ jest to wszystko asynchroniczne i nie mogę po prostu napisać return). Tak rzeczywiście może się zdarzyć, że propagują callback całą drogę do źródła ...
function compareApplications(application, condition, callback) {
var model = database.getModel('Application');
model.find(condition, function (err, applicationFromMongo) {
var result = (applicationFromMongo.applicationID == application.applicationID)
callback(result)
}
}
Zadam wam to - dlaczego jest to problem ? Polecenie 'change' powinno być wywoływane kilka razy. Więc jak Ty (lub GC) kiedykolwiek dowiesz się, kiedy naprawdę skończy się używanie 'bigObject', chyba że odłączysz wydarzenie' change'? Wydaje się, że chcesz jedną instancję 'bigObject', aby program obsługi mógł porównywać typy. Tworzysz go raz, co zmniejsza ładunek za każdym razem, gdy uruchamia się program obsługi. Jeśli chcesz, aby to zostało wyczyszczone, stwórz je w programie obsługi za każdym razem lub spodziewamy się, że "wycieknie" pamięć, ponieważ tak to działa. – Ian
Co powiesz na użycie .one() zamiast .on()? – frenchie
Proszę zauważyć, że zmieniłem przykład. W moim programie na świecie nie używam .on. Przekażę funkcję zwrotną do innej. –