WeakRef与FinalizationRegistry:手动内存管理的最后防线
在垃圾回收不可控的JS世界中,利用WeakRef和FinalizationRegistry实现缓存、监视和资源回收。 · 难度:入门 · +10XP
WeakRef与FinalizationRegistry:手动内存管理的最后防线
WeakRef允许你持有对象的弱引用而不阻止GC回收,FinalizationRegistry则让你在对象被回收时执行清理回调。本教程展示它们的实际应用:构建一个自动清理的LRU缓存(当内存紧张时自动丢弃条目)、监视DOM元素何时被移除并触发反注册事件,以及避免闭包泄漏。你将理解WeakRef的局限性(不保证每次都能获取到对象)、如何配合FinalizationRegistry安全地清理外部资源(如取消网络请求、关闭文件句柄)。注意:不要依赖FinalizationRegistry做关键资源管理,因为回调执行时机不确定。
// 弱引用缓存
class WeakCache {
constructor() {
this.cache = new Map(); // key -> WeakRef
this.registry = new FinalizationRegistry((key) => {
this.cache.delete(key);
});
}
set(key, value) {
const ref = new WeakRef(value);
this.cache.set(key, ref);
this.registry.register(value, key);
}
get(key) {
const ref = this.cache.get(key);
return ref ? ref.deref() : undefined;
}
}