2017-01-31 5 views
0

Ich habe this.bookView = new BookView();JavaScript Speicherleck. Ein Objekt wird nicht wegen der Funktionsvariablen entfernt

Der Garbage Collector wird das Objekt kein Objekt erstellt zu entfernen, wenn ich this.bookView=null tun.

Google Dev Tool Profil Snapshot Retainers Fenster zeigt unter Verbindungen (was zeigt, dass etwas Bezug auf das Objekt hat).

enter image description here

Alle Reihen sind "Preview is not available" außer context in().

enter image description here

enter image description here

Das Problem ist BookViewaddSheet Funktionsvariable hat, die nicht überall (noch) nicht verwendet, sondern hält einen ref durch _this auf sich.

Was ich versucht:

1) this.bookView.addSheet = null; (nicht helfen)

2) delete this.bookView.addSheet; (half auch nicht)

Meine Fragen:

1) Wie entferne ich diese Verbindung aus dem Fenster und mache bookView zur Müllabfuhr?

2) Warum die addSheet Variable vom Window-Objekt verknüpft ist?

3) Was sind die transitions und descriptors auf dem retainers Fenster?

4) Welche anderen Tools kann ich verwenden, um mehr Details über diese Art von Speicherleck zu finden.

P.S. Das Objekt bookView wird in einer Durandal-Seite erstellt. this.bookView ist im Grunde eine page1.bookView. Die Seite wurde korrekt entfernt. Während der deactivate (Seite Entfernung) Funktion aufrufen I this.bookView = null;

+0

'addSheet' oder' AddSheet'? – Oriol

+0

Tippfehler, behoben. 'addSheet'. Danke – AntonIva

+1

Wenn Sie den Debugger pausiert haben und einige der relevanten Variablen in Panels oder in der Konsole angezeigt werden, kann der Devtools-Debugger selbst die Referenzen beibehalten. – wOxxOm

Antwort

1

Wenn Sie nicht BookView aus einem function instanziiert wird, wird this Ihre window Objekt, das global ist. Sie haben es global an das eine Objekt angehängt, das so lange bestehen bleibt, bis Sie Ihren Browser oder Tab schließen. Sie können versuchen, von BookView loszuwerden, indem delete window['bookView']

EDIT versuchen: In Ihrem Durandal Seite deaktivieren Rückruf, laufen durch Ihre this und seine Schlüssel löschen.

for(var key in this) 
    delete this[key]; 
+0

Sorry, habe nicht darüber geschrieben - das BookView wurde auf einer Durandal-Seite erstellt. Die Durandal-Seite wird korrekt entfernt. Während der Deaktivierung der Seite (Seitenentfernung) rufe ich 'this.bookView = null;' auf. Ich bearbeite ursprünglichen Beitrag – AntonIva

+0

Was gibt es aus, wenn Sie eine 'console.log (window.bookView)' '? – JohanP

+0

'console.log (window.bookView)' 'Drucke undefined' – AntonIva