javascript - 关于 JS 垃圾回收的问题

 落单鸟人 发布于 2022-11-08 15:05
代码说明一切

核心代码

Q:

  1. 我 New 的这个对象会不会被回收?

  2. 如果不会被回收,那除了以下方法,有没有其他方法能让该对象被回收:

var a = new A();
a = null;
附上完整可运行代码:




    



    

Click ME!

2 个回答
  • 先自答一个吧,想了一下,其实这就是一个闭包。
    不过又有新问题了,如果我直接用下面方法,将实例化对象置空,并删除Dom对象,但并没有释放事件监听,那这个对象会不会被回收?

    var a = A();
    a.addListener();
    a = null;
    /*  将 .p 从 Dom 删除的代码...  */
    2022-11-12 01:52 回答
    1. 你的写法 a 会从内存中清理, 除非在事件绑定回调方法内调用了a实例

    2. 将.p从Dom树中删除, 因为绑定了事件, 所以并不会清除dom的内存
      当然, 如果是 jquery-1.3.x以上版本

    $(elm).remove() // 该方法会移动事件绑定
    因为该方法同时执行了:
    jQuery.event.remove(elm);

    所以, 如果是用$(elm).remove() 移除dom的, 自然会回收.
    但如果有说一个UL, 里边有n个li,都绑定了事件
    当 $("ul").html('') // 用该方法清空ul, 并不会回收li

    所以, 回收不回收, 看你怎么用了

    另外, 全局有DOM的引用, 也不会清, 看你的dom变量生存周期而定, 如:

    var $p = $('<p>hello</p>');
    // 添加到body
    $p.appendTo("body");
    
    // 移除
    $p.remove();
    
    // $p 还没有回收, 因为我还可以再次:
    $p.appendTo("body"); // 又添加到了body
    
    // ...
    // 如果$p在函数闭包内, 且后面没有引用了, remove()会回收
    // 如果$p在全局环境, 如 window.$p , 则永远不会回收
    
    2022-11-12 01:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有