| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/WeakRef | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit April 2021 browserbergreifend verfgbar.
* Einige Teile dieser Funktion werden mglicherweise unterschiedlich gut untersttzt.
Ein WeakRef-Objekt ermglicht es Ihnen, einen schwachen Verweis auf ein anderes Objekt zu halten, ohne zu verhindern, dass dieses Objekt vom Garbage Collector eingesammelt wird.
Ein WeakRef-Objekt enthlt einen schwachen Verweis auf ein Objekt, das als sein Ziel oder Referent bezeichnet wird. Ein schwacher Verweis auf ein Objekt ist ein Verweis, der nicht verhindert, dass das Objekt vom Garbage Collector zurckgefordert wird. Im Gegensatz dazu hlt ein normaler (oder starker) Verweis ein Objekt im Speicher. Wenn ein Objekt keine starken Verweise mehr auf sich hat, kann der Garbage Collector der JavaScript-Engine das Objekt zerstren und seinen Speicher wieder freigeben. In diesem Fall kann nicht mehr auf das Objekt ber einen schwachen Verweis zugegriffen werden.
Da auch nicht registrierte Symbole vom Garbage Collector eingesammelt werden knnen, knnen sie ebenfalls als Ziel eines WeakRef-Objekts verwendet werden. Der Anwendungsfall hierfr ist jedoch begrenzt.
Der korrekte Einsatz von WeakRef erfordert sorgfltige berlegung und sollte nach Mglichkeit vermieden werden. Es ist auch wichtig, sich nicht auf irgendwelche Verhaltensweisen zu verlassen, die nicht von der Spezifikation garantiert werden. Wann, wie und ob die Garbage Collection erfolgt, hngt von der Implementierung der jeweiligen JavaScript-Engine ab. Ein Verhalten, das Sie in einer Engine beobachten, kann in einer anderen Engine, in einer anderen Version derselben Engine oder sogar in einer leicht unterschiedlichen Situation mit derselben Version der Engine anders sein. Die Garbage Collection ist ein schwieriges Problem, das von den Entwicklern der JavaScript-Engines stndig verfeinert und verbessert wird.
Hier sind einige spezielle Punkte, die von den Autoren im Vorschlag enthalten sind, der WeakRef eingefhrt hat:
Garbage Collector sind kompliziert. Wenn eine Anwendung oder Bibliothek darauf angewiesen ist, dass der GC einen WeakRef oder einen Finalizer [Aufrum-Callback] zeitnah und vorhersehbar aufrumt, wird sie wahrscheinlich enttuscht sein: Die Bereinigung kann viel spter als erwartet erfolgen oder berhaupt nicht. Quellen der Variabilitt umfassen:
- Ein Objekt knnte viel frher als ein anderes Objekt eingesammelt werden, selbst wenn sie zur selben Zeit nicht mehr erreichbar sind, z.B. aufgrund der Generational Collection.
- Die Garbage-Collection-Arbeit kann mit inkrementellen und gleichzeitigen Techniken ber die Zeit verteilt werden.
- Verschiedene Laufzeit-Heuristiken knnen verwendet werden, um den Speicherverbrauch und die Reaktionsfhigkeit abzuwgen.
- Die JavaScript-Engine kann Verweise auf Dinge halten, die den Anschein erwecken, nicht erreichbar zu sein (z.B. in Closures oder Inline-Caches).
- Verschiedene JavaScript-Engines knnen diese Dinge unterschiedlich handhaben oder dieselbe Engine kann ihre Algorithmen zwischen den Versionen ndern.
- Komplexe Faktoren knnen dazu fhren, dass Objekte unerwartet lange am Leben gehalten werden, z.B. bei der Verwendung bestimmter APIs.
WeakRef fr ein Zielobjekt erstellt hat oder ein Zielobjekt aus der deref-Methode einer WeakRef erhalten hat, wird dieses Zielobjekt bis zum Ende des aktuellen JavaScript-Jobs (einschlielich aller Promise-Reaktionsjobs, die am Ende eines Script-Jobs laufen) nicht zurckgefordert. Das bedeutet, Sie knnen nur "sehen", dass ein Objekt zwischen den Durchlufen der Ereignisschleife zurckgefordert wird. Dies soll in erster Linie verhindern, dass das Verhalten des Garbage Collectors einer beliebigen JavaScript-Engine im Code sichtbar wird denn wenn das der Fall wre, wrden die Leute Code schreiben, der sich auf dieses Verhalten verlsst, was zu Problemen fhren wrde, wenn sich das Verhalten des Garbage Collectors ndert. (Die Garbage Collection ist ein schwieriges Problem; die Entwickler der JavaScript-Engines verfeinern und verbessern stndig, wie sie funktioniert.)WeakRefs dasselbe Ziel haben, sind sie untereinander konsistent. Das Ergebnis des Aufrufs von deref auf einem von ihnen wird mit dem Ergebnis des Aufrufs von deref auf einem anderen von ihnen (im selben Job) bereinstimmen. Man erhlt das Zielobjekt von einer von ihnen, aber nicht undefined von einer anderen.WeakRef sich auch in einem FinalizationRegistry befindet, wird das Ziel des WeakRef zur gleichen Zeit gelscht oder bevor ein Aufrum-Callback, das mit dem Register verknpft ist, aufgerufen wird; wenn Ihr Aufrum-Callback deref auf einem WeakRef fr das Objekt aufruft, erhlt es undefined.WeakRef nicht ndern, es bleibt immer nur das ursprngliche Zielobjekt oder undefined, wenn dieses Ziel zurckgefordert wurde.WeakRef knnte nie undefined von deref zurckgeben, auch wenn nichts das Ziel stark hlt, da der Garbage Collector mglicherweise nie entscheidet, das Objekt zurckzufordern.WeakRef()Erstellt ein neues WeakRef-Objekt.
Diese Eigenschaften sind auf WeakRef.prototype definiert und werden von allen WeakRef-Instanzen geteilt.
WeakRef.prototype.constructor OptionalDie Konstruktionsfunktion, die das Instanzobjekt erstellt hat. Fr WeakRef-Instanzen ist der Anfangswert der WeakRef-Konstruktor.
Hinweis:
Diese Eigenschaft ist in der Spezifikation als "normativ optional" gekennzeichnet, was bedeutet, dass eine konforme Implementierung die constructor-Eigenschaft mglicherweise nicht offenlegt. Dies verhindert, dass beliebiger Code den WeakRef-Konstruktor erhlt und die Garbage Collection beobachtet. Allerdings enthllen alle groen Engines sie standardmig.
WeakRef.prototype[Symbol.toStringTag]Der Anfangswert der [Symbol.toStringTag]-Eigenschaft ist der String "WeakRef". Diese Eigenschaft wird in Object.prototype.toString() verwendet.
WeakRef.prototype.deref()Gibt das Zielobjekt des WeakRef-Objekts oder undefined zurck, wenn das Zielobjekt zurckgefordert wurde.
Dieses Beispiel startet einen Zhler, der in einem DOM-Element angezeigt wird und anhlt, wenn das Element nicht mehr existiert:
class Counter {
constructor(element) {
// Remember a weak reference to the DOM element
this.ref = new WeakRef(element);
this.start();
}
start() {
if (this.timer) {
return;
}
this.count = 0;
const tick = () => {
// Get the element from the weak reference, if it still exists
const element = this.ref.deref();
if (element) {
element.textContent = ++this.count;
} else {
// The element doesn't exist anymore
console.log("The element is gone.");
this.stop();
this.ref = null;
}
};
tick();
this.timer = setInterval(tick, 1000);
}
stop() {
if (this.timer) {
clearInterval(this.timer);
this.timer = 0;
}
}
}
const counter = new Counter(document.getElementById("counter"));
setTimeout(() => {
document.getElementById("counter").remove();
}, 5000);
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-weak-ref-objects |
WeakRefObject/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |