Wird Inline-JavaScript-Garbage gesammelt, wenn der Dokumententext ersetzt wird?

8

Beachten Sie, dass ich die folgende Webseite in HTML geschrieben habe (nur im Bereich body):

%Vor%

Wenn ich nun innerHTML von document.body von JavaScript durch say, ein div, ersetze, wird der Körperteil zu:

%Vor%

... ist dann das fn Objekt geeignet für die Garbage Collection, wenn keine Referenzen darauf im Rest des Codes vorhanden sind (irgendein Kontext)?

    
John Weisz 23.07.2015, 16:07
quelle

2 Antworten

1

Es würde einer Speicherbereinigung unterliegen, wenn keine anderen Referenzen von irgendeinem Kontext auf es bezogen würden. Es gibt jedoch einen kleinen Verweis, der diese Funktion, das globale Fensterobjekt, festhält. Dies liegt daran, dass die Funktion (und der gesamte gezeigte Skriptabschnitt) global ausgerichtet ist. Diese Referenz existiert auch dann, wenn das gesamte Dokument.body's innerHTML ersetzt wird.

Es gibt nur wenige Möglichkeiten, das in Ihrem exakten Beispiel gezeigte Objekt vom globalen Objekt zu befreien und es für die Sammlung geeignet zu machen. Das Löschen der Eigenschaft für das globale Objekt ist keine Option, da sie als Funktion und nicht als Eigenschaft deklariert wurde.

  • Überschreiben Sie die Eigenschaft des globalen Objekts mit etwas anderem. window.fn = [][0]; (nicht definierte Verknüpfung)
  • Navigieren Sie von der Seite weg, damit das globale Objekt für die Garbage Collection geeignet wird.

Schneller Hinweis zur Garbage Collection, wenn der Browser das Gefühl hat, dass es notwendig ist, und nicht unmittelbar nachdem ein Objekt keine Referenzen hat (oder zumindest nicht normalerweise - dies kann von Zeit zu Zeit passieren) Zeit).

    
Travis J 24.07.2015, 09:07
quelle
1

Habe das gerade getestet, und interessanterweise, nein.

Ссылка

Testcode:

Körper:

%Vor%

und beim Laden wird dies ausgeführt:

%Vor%     
deleted user 23.07.2015 17:03
quelle