Signatur
Beschreibung
WeakRef ermöglicht es, einen Verweis auf ein Objekt zu speichern, ohne dessen Lebenszeit zu verlängern. Anders als normale Variablen oder Properties zählt ein WeakRef nicht als starke Referenz: Sobald keine anderen starken Verweise auf das Zielobjekt existieren, kann der Garbage Collector (GC) es jederzeit freigeben.
Der Zugriff auf das referenzierte Objekt erfolgt über deref(). Diese Methode gibt das Objekt zurück, solange es noch existiert — oder undefined, wenn es bereits eingesammelt wurde. Jeder Code, der deref() aufruft, muss daher prüfen, ob der Rückgabewert undefined ist.
Typische Einsatzszenarien sind Caches, bei denen gecachte Objekte automatisch freigegeben werden sollen, wenn sie sonst nicht mehr verwendet werden, sowie Event-Listener-Verwaltung in Situationen, in denen ein Listener nicht das beobachtete Objekt am Leben halten soll. WeakRef wird häufig zusammen mit FinalizationRegistry eingesetzt, um auf die Bereinigung eines Objekts zu reagieren.
Wichtig: Der genaue Zeitpunkt der Garbage-Collection ist nicht spezifiziert und implementierungsabhängig. Verlasse dich nie auf ein deterministisches Verhalten von WeakRef — das Objekt kann in einem Durchlauf noch vorhanden sein und im nächsten bereits fehlen. Verwende WeakRef nur dann, wenn dein Code korrekt funktioniert, auch wenn deref() jederzeit undefined zurückgibt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | object | Das Zielobjekt, auf das der schwache Verweis zeigen soll. Muss ein Objekt (oder ein nicht-registriertes Symbol) sein — primitive Werte wie number oder string sind nicht erlaubt. |
Rückgabewert
WeakRef-Instanz, die einen schwachen Verweis auf target hält.Beispiele
Einfacher Cache mit automatischer Freigabe
// Objekt im Cache halten, ohne seine GC zu blockieren
let bigData = { payload: new Array(1_000_000).fill('x') };
const ref = new WeakRef(bigData);
// Starke Referenz aufheben — Objekt kann jetzt vom GC freigegeben werden
bigData = null;
// Später: schwachen Verweis auflösen
const data = ref.deref();
if (data !== undefined) {
console.log('Objekt noch vorhanden:', data.payload.length);
} else {
console.log('Objekt wurde bereits vom GC freigegeben.');
}
Memoization-Cache mit WeakRef und FinalizationRegistry
const cache = new Map();
const registry = new FinalizationRegistry((key) => {
// Eintrag aus Map entfernen, wenn das gecachte Objekt freigegeben wurde
const ref = cache.get(key);
if (ref !== undefined && ref.deref() === undefined) {
cache.delete(key);
console.log(`Cache-Eintrag für '${key}' wurde bereinigt.`);
}
});
const memoize = (key, factory) => {
const existing = cache.get(key)?.deref();
if (existing !== undefined) {
return existing;
}
const value = factory();
const ref = new WeakRef(value);
cache.set(key, ref);
registry.register(value, key); // GC-Callback registrieren
return value;
};
// Nutzung
let result = memoize('myKey', () => ({ computed: 42 }));
console.log(result.computed); // 42
// Zweiter Aufruf: liefert gecachtes Objekt (sofern noch am Leben)
const result2 = memoize('myKey', () => ({ computed: 99 }));
console.log(result2.computed); // 42 (aus Cache)
// Wichtig · Fallstricke
Nicht-deterministisches Verhalten: Der ECMAScript-Standard schreibt nicht vor, wann der GC ein Objekt freigibt. Engines dürfen Objekte sofort, verzögert oder überhaupt nicht freigeben (z. B. in kurzen Skripten). Schreibe Code so, dass er korrekt ist, egal ob deref() ein Objekt oder undefined zurückgibt.
Nicht in synchronen Codeblöcken prüfen: Innerhalb desselben synchronen Codeblocks kann ein Objekt, das in einem deref()-Aufruf noch vorhanden war, beim nächsten Aufruf fehlen. Speichere das Ergebnis von deref() in einer lokalen Variablen und verwende diese.
Browser-Kompatibilität: WeakRef ist seit Chrome 84, Firefox 79, Safari 14.1 und Node.js 14.6 verfügbar. In älteren Umgebungen ist kein vollständiges Polyfill möglich.
Kein Missbrauch als Speicher-Optimierung: WeakRef ist kein Allheilmittel gegen Memory-Leaks — prüfe zuerst, ob ein einfaches WeakMap oder WeakSet ausreicht, da diese in den meisten Fällen die bessere und sicherere Wahl sind.