2015-02-17 12 views
5

buduję javascript grę, która tworzy obiekt „poziom” używając var:Jak wykryć, czy obiekt został śmieci zebrane w JavaScript?

function start() { 
    var myGameLevel = new Level(2); 
} 

Ten „Level()” obiekt posiada wiele funkcji, przede wszystkim dodawanie elementów do DOM i czyniąc je interaktywne. Uproszczenie:

function Level(i) { 
    var _difficulty = i; 

    this.init = function(){ 
     jQuery("#container").append(...game elements here...); 
     jQuery("#button").on('click', function() {...}); 
    } 
} 

Moje pytanie: jak mogę wiedzieć, czy przedmiot Poziom stworzony w funkcji „start” został śmieci zebrane, czy nie? Zamierzam użyć tylko zmiennych "var", aby nie było żadnych odnośników zewnętrznych. Kiedy DOM zostanie usunięty z wszystkich elementów gry, OCZEKUJĘ obiektu "poziom", który ma zostać zwolniony z pamięci, ale jak mogę być pewien?

+0

Jeśli używasz Chrome, czy wypróbowałeś profilowanie pamięci w debugerze? – dowomenfart

+0

Cóż, nie jestem pewien, czego szukać? Ponieważ cały obiekt poziomu jest anonimowy? Debuger Chrome ma wiele ekranów, list i opcji. Gdzie znajdę mój obiekt "Poziom"? – Kokodoko

+0

@Kokodoko dostałeś jakieś obejście? –

Odpowiedz

3

Nie sądzę, że można kontrolować usuwanie śmieci JavaScript. Zwykle można zbierać zmienną lub obiekt, jeśli nie ma do nich odniesienia. Dzięki temu możesz zwiększyć swoje szanse na zgromadzenie obiektu poprzez zaprojektowanie logiki, aby obiekt wykraczał poza zakres.

+0

Nie muszę tego kontrolować, chcę tylko wiedzieć, czy obiekt został GC, czy nie. Ponieważ wszystko jest anonimowe, nie mogę uzyskać do niego dostępu w konsoli lub w kodzie, ale nadal może istnieć. – Kokodoko

5

Słabe referencje are considered a security risk, a tym samym niedostępne dla nieuprzywilejowanego kodu w przeglądarkach.

Obawy te nie dotyczą kodu uprzywilejowanego lub wykonania javascript na serwerze, np. poprzez node.js, a tym samym implementacje słabych odniesień do platformy mogą być dla nich dostępne.
E.g. Świat Firefox może używać Components.utils.getWeakReference()

Dla pewnych wzorców programowania WeakMap/WeakSet może być wystarczające, ale nie pozwalają program obserwować zbieranie śmieci, ponieważ mogłoby to to potrzebny jest klucz do badania tych struktur danych, ale trzymając że Klucz uniemożliwiłby zbieranie przedmiotów w pierwszej kolejności.

Dodatkową obawą wyrażaną przez implementatorów JS jest to, że w zależności od tego, jak silne będą hipotetyczne, słabe interfejsy API - np. oferowanie powiadomień o finalizacji - może ujawnić znaczne ilości działania GC, co z kolei może ograniczyć przyszłe implementacje, ponieważ zmiana zachowania może przerwać aplikacje internetowe.


Aktualizacja: Nie teraz is a proposal standaryzacja słabe odwołania w JS, który zmniejsza ryzyko postrzegane przez wiązanie uwalnianie słabo osiągalnych obiektów do pętli zdarzeń JS, dzięki czemu zachowanie bardziej deterministyczny.

+0

Więc mówisz, że właściwie nigdy nie powinienem używać "var myLevel = Level()"? To może być dobra rada, ale wciąż pozostaje pytanie: po ustawieniu myLevel na null, jak mogę być pewien, że Thing() nie jest nadal uruchomiony kod? Trudno jest znaleźć w Chrome Inspector. – Kokodoko

+0

Nie, mówię, że jedynym sposobem na wykrycie, że coś zostało zebrane przez śmieci, będzie słaby punkt odniesienia. Ale słabe referencje nie są dostępne dla nieuprzywilejowanego kodu. – the8472

+0

O czym ty do diabła mówisz?Nie, gdzie w tym linku znajduje się informacja o zagrożeniach bezpieczeństwa. –