FinalizationRegistry
一般来说,在JavaScript中,对象的引用是强引用的,这意味着只要持有对象的引用,它就不会被垃圾回收。只有当该对象没有任何的强引用时, js引擎垃圾回收器才会销毁该对象并且回收该对象所占的内存空间。
let obj = { a: 1 } //只要存在访问obj, 对象就不会被回收
使用FinalizationRegistry对象可以在垃圾回收器回收对象时执行回调函数
// 构建监听对象被垃圾回收器清除的回调
const registry = new FinalizationRegistry(heldValue => {
if (val === "obj") {
console.log("obj对象被销毁");
}
if (val === "token") {
console.log("token对象被销毁");
}
});
const obj = {};
const token = {};
// 注册监听
/********
* register 参数分别为:
* obj1: 需要监听的对象
* func: 执行回调函数的参数
* obj2: 取消监听用的标识符
* */
registry.register(obj, "obj deleted!", token);
// 取消监听
registry.unregister(token);
obj = null // obj对象被销毁
WeakRefs
WeakRef对象允许创建对另一个对象的弱引用,对象的弱引用是指当该对象应该被 js引擎垃圾回收器回收时不会阻止垃圾回收器的回收行为。
Weakref 实例具有一个方法 deref,该方法返回被引用的原始对象,如果原始对象已被收集,则返回 undefined 对象。
const ref = new WeakRef({ name: 'aaa' });
let obj = ref.deref();
if (obj) {
console.log(obj.name); // aaa
}
let o = {
name: "aaa",
};
const foo = new WeakRef(o);
console.log(foo.deref()); // aaa
setTimeout(() => {
console.log(foo.deref()); // undefined
}, 10000);
obj = null;
网友评论