美文网首页
FinalizationRegistry & WeakRefs

FinalizationRegistry & WeakRefs

作者: 勇敢的小拽马 | 来源:发表于2022-10-24 15:30 被阅读0次

    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;
    

    相关文章

      网友评论

          本文标题:FinalizationRegistry & WeakRefs

          本文链接:https://www.haomeiwen.com/subject/ladgzrtx.html