JavaScript FinalizationRegistry
FinalizationRegistry对象(ES2021):对象被垃圾回收后的清理回调、register(target,heldValue,unregisterToken)注册、unregister取消注册、WeakRef.deref检查弱引用对象是否还存活、用例(清理共享资源/缓存过期但不要依赖GC时机) · 难度:入门 · +10XP
JavaScript FinalizationRegistry —— 对象被GC时执行回调
FinalizationRegistry让你注册一个回调——当注册的对象被垃圾回收时,回调被执行。用于清理与对象关联的外部资源(如释放WebGL纹理、关闭文件句柄)。
基本用法
const registry = new FinalizationRegistry((heldValue) => {
console.log('对象被回收了,清理资源:', heldValue);
});
let obj = { data: 'important' };
registry.register(obj, 'some-resource-id');
obj = null; // obj没有强引用了
// ... 一段时间后GC运行 ...
// 控制台打印:对象被回收了,清理资源:some-resource-id
注意:不要依赖GC时机!不同引擎行为不同。FinalizationRegistry用于"尽力而为"的资源清理。
动手练习
- 基础练习:注册一个对象到FinalizationRegistry,观察它被回收时回调是否触发。
- 进阶应用:用WeakRef+FinalizationRegistry实现带自动清理的缓存。
- 项目实战:在WebGL应用中用FinalizationRegistry自动释放GPU纹理。