JavaScript WeakRef 与 FinalizationRegistry
WeakRef弱引用(不阻止GC回收)、FinalizationRegistry对象被GC时回调、使用场景(缓存/资源清理)、警告:不要依赖GC时机(不同引擎行为不同)、WeakRef.deref()返回undefined表示已回收 · 难度:入门 · +10XP
JavaScript WeakRef 与 FinalizationRegistry —— 弱引用与清理回调
WeakRef让你持有一个对象的"弱引用"——不阻止垃圾回收。FinalizationRegistry在对象被GC后执行清理回调。
WeakRef
let obj = { data: 'important' };
const weakRef = new WeakRef(obj);
// obj还在 → weakRef.deref()返回对象
obj = null; // 没有强引用了
// GC后 → weakRef.deref()返回undefined
FinalizationRegistry
const registry = new FinalizationRegistry((value) => {
console.log('对象被回收了,清理资源:', value);
});
let obj = {};
registry.register(obj, 'some-cleanup-value');
obj = null; // 被GC后触发回调
警告:不要依赖GC时机!不同引擎行为不同,GC可能很久才执行。
动手练习
- 基础练习:用WeakRef实现一个带自动清理的缓存——缓存项可被GC回收。
- 进阶应用:用FinalizationRegistry在对象被回收时自动释放关联资源。
- 项目实战:研究WeakRef在大型应用缓存策略中的应用。