Muss ich in JavaScript, wenn er mit einem über neuen ActiveXObject erstellten Objekt fertiggestellt wird, es auf NULL einstellen?

StackOverflow https://stackoverflow.com/questions/5835507

Frage

Sagen wir in einem JavaScript -Programm, das in WSH ausgeführt wird und Objekte erstellt, beispielsweise Scripting.FilesSystemObject oder ein beliebiges COM -Objekt, die Variable auf Null festlegen, wenn ich damit fertig bin? ZB, zB ich empfehle ich, dies zu tun:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = fso.openTextFile(filename);
fso = null;  // recommended?  necessary? 
... use fileStream here ...
fileStream.Close();
fileStream = null;  // recommended? necessary?

Unterscheidet sich der Effekt, als nur die Vars aus dem Spielraum ausgehen zu lassen?

War es hilfreich?

Lösung

Wenn Sie Null einer Objektvariablen zuweisen, wird der Referenzzähler so abgelehnt, dass das Speicherverwaltungssystem die Ressource verwerfen kann - sobald es sich so anfühlt. Der Referenzzähler wird automatisch dekrementiert, wenn die Variable aus dem Umfang ausgeht. Es ist also in fast allen Fällen eine Zeitverschwendung.

Theoretisch könnte eine Funktion, die ein großes Objekt A in seinem ersten und ein weiteres großes Objekt B in seinem zweiten Teil verwendet, speichereffizienter sein, wenn A in der Mitte auf null eingestellt ist. Da dies jedoch die MMS nicht zwingt, a zu zerstören, könnte die Aussage immer noch eine Verschwendung sein.

Sie können kreisförmige Referenzen erhalten, wenn Sie ein ausgefallenes Klassendesign durchführen. Dann mag es notwendig sein, den Kreis von Hand zu brechen - aber vielleicht überhaupt zu vermeiden, wäre es besser.

Es gibt Gerüchte über alte Datenbankzugriffsobjekte mit Fehlern, die durch Zapping -Variablen vermieden werden könnten. Ich würde meine Programmierregeln nicht auf solch Voodoo stützen.

(Es gibt Unmengen von VBScript -Code im Internet, das voller "Set x = nichts" ist. Wenn die Autoren gefragt werden, neigen die Autoren dazu, über 'Gewohnheit' und andere Sprachen (C, C ++) zu sprechen.)

Andere Tipps

Aufbauend auf dem, was Ekkehard.Horner gesagt hat ...

Skripte wie VBScript, JScript und ASP werden in einer Umgebung ausgeführt, in der Speicher für Sie verwaltet wird. Daher entfernen Sie ihn als solches nicht unbedingt aus dem Speicher, um einen Objektverweis auf Null oder leer zu gestalten ... zumindest nicht sofort. (In der Praxis ist es oft fast augenblicklich, aber in Wirklichkeit wird die Aufgabe einer Warteschlange in der Umgebung hinzugefügt, die zu einem späteren Zeitpunkt ausgeführt wird.) In dieser Hinsicht ist es wirklich viel weniger nützlich, als Sie vielleicht denken.

Im kompilierten Code ist es wichtig, Speicher vor einem Programm (oder in einigen Fällen in einigen Fällen) zu bereinigen, so dass ein zugewiesener Speicher an das System zurückgegeben wird. Dies verhindert alle möglichen Probleme. Außerhalb des langsamen Codes ist dies am wichtigsten, wenn ein Programm beendet ist. In Skriptumgebungen wie ASP oder WSH kümmert sich die Speicherverwaltung diese Reinigung automatisch, wenn ein Skript beendet. Alle Objektreferenzen werden für Sie auf Null gesetzt, auch wenn Sie es selbst nicht selbst ausdrücklich tun, was das ganze Durcheinander in diesem Fall unnötig macht.

In Bezug auf Gedächtnisbedenken während der Skriptausführung sind Sie, wenn Sie Arrays oder Wörterbuchobjekte erstellen, die groß genug sind, um Probleme zu verursachen, entweder weit über den Umfang des Skripts hinaus oder Sie haben den falschen Ansatz in Ihrem Code gewählt. Mit anderen Worten, dies sollte noch nie passieren in VBScript. Tatsächlich führt die Umwelt für die Größen von Arrays und Wörterbuchobjekten Grenzen, um diese Probleme überhaupt zu verhindern.

Wenn Sie langlebige Skripte haben, die Objekte oben/Start verwenden, die während des Hauptprozesses nicht benötigt werden, kann das Einstellen dieser Objekte in Null den Speicher früher freisetzen und keinen Schaden anrichten. Wie von anderen Postern erwähnt, kann es einen geringen praktischen Nutzen geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top