Dieser Artikel erläutert ausführlich das Timing und die Methoden der Speicherverwaltung und -veröffentlichung durch JavaScript und IE Browser, in der Hoffnung, für Front-End-Entwickler hilfreich zu sein.
Eine Instanz der Speicherfreigabe
Die Codekopie lautet wie folgt:
<Script Language = "JavaScript">
<!-
Strest = "1";
für (var i = 0; i <25; i ++)
{
strTest += strTest;
}
Alarm (Strest);
Stretest löschen;
Collectgarbage ();
//->
</Script>
Collectgarbage ist eine einzigartige Eigenschaft des IE, die zum Freigeben von Speicher verwendet wird. Die Verwendungsmethode sollte sein: Setzen Sie das Variable oder das Referenzobjekt in Null oder Löschen und führen Sie dann die Freigaberaktion aus.
Zwei notwendige Bedingungen müssen klar sein, bevor sie Collectgarbage durchführen:
Referenz - Ein Objekt ist außerhalb des Kontextes, in dem es lebt, ungültig.
- Ein globales Objekt ist ungültig, wenn es nicht ausgeführt wird (verwiesen).
Die Codekopie lautet wie folgt:
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Wann fällt JavaScript -Objekt fehl?
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Funktion testObject () {
var _obj1 = neues Objekt ();
}
Funktion testObject2 () {
var _obj2 = neues Objekt ();
return _obj2;
}
// Beispiel 1
testObject ();
// Beispiel 2
testObject2 ()
// Beispiel 3
var obj3 = testObject2 ();
obj3 = null;
// Beispiel 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
In diesen vier Beispielen:
- "Beispiel 1" konstruiert _obj1 im Funktion testObject (), aber wenn die Funktion ausgeht, hat sie den Kontext der Funktion gelassen, sodass _obj1 ungültig ist;
- In "Beispiel 2" wird ein Objekt _obj2 auch in testObject2 () konstruiert und ohnmächtig, sodass das Objekt eine Kontextumgebung (und eine Lebensdauer) "außerhalb der Funktion" hat, aber da der Rückgabewert der Funktion nicht von anderen Variablen "gehalten" wird, ist _OBJ2 sofort ungültig.
- In "Beispiel 3" wird die von TestObject2 () konstruierte _obj2 von der externen variablen OBJ3 gehalten. Zu diesem Zeitpunkt ist _OBJ2 nicht ungültig, weil die Referenzbeziehung nicht ungültig ist, bis die Codezeile "obj3 = null" wirksam wird.
- Aus dem gleichen Grund wie in Beispiel 3 ist _obj2 in "Beispiel 4" nach der Codezeile "arr = []" nicht ungültig.
Der "Fehler" des Objekts wartet jedoch nicht, "freigegeben" zu werden. In der JavaScript -Laufzeit gibt es keine Möglichkeit, dem Benutzer genau zu sagen, dass "wann das Objekt veröffentlicht wird". Dies hängt vom JavaScript -Speicherwiederherstellungsmechanismus ab. »Diese Strategie ähnelt dem Recycling -Mechanismus in .NET.
Im vorherigen Excel -Operation -Beispielcode wird der Eigentümer des Objekts, dh "excel.exe", erst nach "Freigabe der ActiveX -Objektinstanz" auftreten. Die Dateisperrungen und die Berechtigungsnachweise des Betriebssystems beziehen sich auf den Prozess. Wenn das Objekt also nur "fehlgeschlagen" und nicht "freigegeben" ist, haben andere Prozesse Probleme beim Verarbeiten von Dateien und bei der Verweise auf die Berechtigungsnachweise des Betriebssystems.
- Einige Leute sagen, dies ist ein Fehler im JavaScript- oder COM -Mechanismus. Eigentlich ist es nicht. Dies wird eher durch eine komplexe Beziehung zwischen OS, IE und JavaScript als durch ein unabhängiges Problem verursacht.
Microsoft hat eine Strategie zur Lösung dieses Problems enthüllt: Aufrufen des Speicherrecyclingprozesses proaktiv.
Ein Collectgarbage () -Prozess (normalerweise als GC -Prozess bezeichnet) wird in (Microsoft) Jscript bereitgestellt. Der GC -Prozess wird verwendet, um die "fehlgeschlagene Objektfehlausrichtung" im aktuellen IE zu beseitigen, dh dem Destruktor -Prozess, das Objekt aufzurufen.
Im obigen Beispiel lautet der Code, der die GC -Prozedur aufruft,:
Die Codekopie lautet wie folgt:
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Standardaufrufmethode von GC -Prozeduren bei der Verarbeitung von ActiveX -Objekt
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Funktion writexls () {
//(leicht...)
excel.quit ();
excel = null;
setTimeout (Collectgarbage, 1);
}
Die erste Codezeile ruft die Excel.Quit () -Methode auf, um den Excel -Prozess abbrechen und beenden. Da die JavaScript -Umgebung zu diesem Zeitpunkt eine Excel -Objektinstanz hat, fällt der Excel -Prozess nicht tatsächlich ab.
Die zweite Codezeile macht Excel null, um Objektreferenzen zu löschen und so das Objekt "ungültig zu machen". Da sich das Objekt jedoch noch im Funktionskontext befindet, wird das Objekt immer noch nicht gereinigt, wenn die GC -Prozedur direkt aufgerufen wird.
Die dritte Codezeile verwendet setTimeout (), um die CollectGarbage -Funktion aufzurufen, und das Zeitintervall wird auf '1' gesetzt, wodurch der GC -Prozess nur nach Ausführung der Funktion writexls () stattfindet. Auf diese Weise erfüllt das Excel -Objekt zwei Bedingungen von "kann von GC aufgeräumt werden": keine Referenz und Verlassen des Kontextes.
Die Verwendung von GC -Prozeduren ist in JS -Umgebungen mithilfe von ActiveX -Objekt sehr effektiv. Einige potenzielle ActiveXObjects umfassen XML, VML, OWC (Office Web Componet), Flash und sogar Vbarray in JS. Aus dieser Sicht bietet die AJAX -Architektur XMLHTTP und muss auch die Funktion "No Page Switching" erfüllen. Wenn Sie den GC -Prozess zu angemessenen Zeiten aktiv aufrufen, erhalten Sie eine bessere Effizienzerfahrung mit der Benutzeroberfläche.
Tatsächlich wird das oben erwähnte Excel -Problem auch beim GC -Prozess nicht vollständig gelöst. Weil dh auch Berechtigungsnachweise zwischengeschnitten werden. Die einzige Möglichkeit, die Berechtigungsnachweise der Seite zu aktualisieren, besteht darin, "auf eine neue Seite wechseln".
Tatsächlich war die von mir verwendete Methode im oben erwähnten SPS -Projekt nicht GC, sondern der folgende Code:
Die Codekopie lautet wie folgt:
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Seitenschaltcode, die bei der Verarbeitung von ActiveX -Objekt verwendet wird
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Funktion writexls () {
//(leicht...)
excel.quit ();
excel = null;
// Der folgende Code wird verwendet, um einen Fehler in IE Call Excel zu lösen, der in MSDN angegebenen Methode:
// setTimeout (COMMANTGARBAG, 1);
// Da der vertrauenswürdige Zustand der Webseite nicht gelöscht (oder synchronisiert) werden kann, wird Saveas () und andere Methoden dazu führen
// Das nächste Mal ungültig, wenn Sie es anrufen.
location.reload ();
}
Beschreibung des Löschbetreibers im Handbuch
Die Referenz entfernt ein Attribut aus einem Objekt oder löscht ein Element aus einem Array.
Ausdruck löschen
Der Expressionsparameter ist ein gültiger Jscript -Ausdruck, normalerweise ein Eigenschaftsname oder ein Array -Element.
veranschaulichen
Wenn das Ergebnis des Ausdrucks ein Objekt ist und das in Expression angegebene Attribut vorhanden ist und das Objekt nicht zulässt, dass es gelöscht wird, wird Falsch zurückgegeben.
In allen anderen Fällen kehren Sie true zurück.
Schließlich wird eine ergänzende Anmerkung zu GC: Wenn das IE -Formular minimiert wird, wird der IE die Collectgarbage () -Funktion einmal aktiv aufrufen. Dadurch wird die Speicherverwendung erheblich verbessert, nachdem das IE -Fenster minimiert wurde