Führen JavaScript-Verschlüsse mit einer this / self-Referenz zu Speicherlecks?

8

Nach meinem Verständnis von Speicherlecks führt das Verweisen auf eine außerhalb des Gültigkeitsbereichs liegende Variable innerhalb eines Closures zu einem Speicherverlust.

Aber es ist auch eine gängige Praxis, eine "that" var zu erstellen, um die "this" -Referenz zu bewahren und sie innerhalb einer Schließung zu verwenden, insbesondere für Ereignisse.

Also, was ist mit so etwas zu tun?

%Vor%

Würde das nicht zu einem kleinen Leck führen?

    
George Hess 17.02.2012, 00:18
quelle

3 Antworten

4

Ja, ja, es verursacht Speicherlecks, zumindest in einigen Browsern (rate mal). Dies ist einer der überzeugendsten Gründe, auf eines der verschiedenen verfügbaren Frameworks zu vertrauen und alle Event-Handler über seine Mechanismen einzurichten, anstatt "DOM 0" Event-Handler direkt hinzuzufügen.

Internet Explorer (mindestens vor 9, und möglicherweise einschließlich 9) hat intern (mindestens) zwei Speicherzuordnungsmechanismen: eine für das DOM und eine für JavaScript (gut JScript). Sie verstehen sich nicht. Selbst wenn ein DOM-Knoten freigegeben wird, wird kein Schließspeicher wie in diesem Beispiel freigegeben.

edit - Oh, und der Grund, warum ich Frameworks erwähne, ist, dass sie im Allgemeinen Code enthalten, um dieses Problem zu mildern. Die Vermeidung von Anhängen an DOM-Knoteneigenschaften ist einer der sichersten Ansätze. Alle Browser, über die Sie sich Gedanken machen sollten (einschließlich älterer IE-Versionen), haben alternative Möglichkeiten, Ereignishandler beispielsweise an DOM-Knoten anzuhängen.

    
Pointy 17.02.2012 00:23
quelle
1

Hier im Dunkeln geschossen, aber ich denke das:

%Vor%

löschte das "Speicherleck" von that

    
Eric 17.02.2012 00:25
quelle
1

Es gab eine Zeit mit IE, dass Zirkelverweise, die DOM-Elemente beinhalteten (die typischerweise bei der Zuweisung einer Funktion zu einem Listener durch Verschlüsse gebildet wurden) Speicherlecks verursachten, z. B.

%Vor%

Ich denke jedoch, dass sie so weit repariert oder gepatcht sind, dass sie ignoriert werden können, wenn die Tests nichts anderes zeigen. Es gibt auch eine Reihe von Möglichkeiten, solche Schließungen zu vermeiden. Daher können sie, selbst wenn sie ein Problem darstellen, umgangen werden (z. B. sollten keine Zirkelverweise für DOM-Elemente erstellt werden).

Bearbeiten

Die Verwendung von Bibliotheken oder einer anderen Methode zum Anhängen von Zuhörern kann weiterhin zirkuläre Referenzen und Speicherlecks erzeugen, z. in IE:

%Vor%

Das obige Beispiel verwendet attachEvent , um einen Listener hinzuzufügen (was ziemlich alle Frameworks für IE & lt; 9 verwendet, einschließlich jQuery), erzeugt aber dennoch einen Zirkelverweis mit a DOM-Element und so wird in bestimmten Versionen von IE lecken. Wenn Sie also nur eine Bibliothek verwenden, die das Problem nicht beheben kann, müssen Sie die Ursachen verstehen und vermeiden.

    
RobG 17.02.2012 00:24
quelle