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

查看:145
本文介绍了javascript - 关于 JS 垃圾回收的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

代码说明一切

核心代码

Q:

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

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

var a = new A();
a = null;

附上完整可运行代码:

<!DOCTYPE html>
<html>

<head>
    <style>
        .div {
            width: 160px;
            box-shadow: 0 1px 2px rgba(0, 0, 0, .6);
        }
    </style>
</head>

<body>
    <div class="div">
        <h1>
            Click ME!
        </h1>
    </div>
    <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <script>
        function A() {
            this.addListener = function () {
                $('.div').on('click', function () {
                    alert('Clicked Me!');
                });
            }
        }

        (new A()).addListener();
</script>
</body>

</html>

解决方案

  1. 你的写法 a 会从内存中清理, 除非在事件绑定回调方法内调用了a实例

  2. 将.div从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 $div = $('<div>hello</div>');
// 添加到body
$div.appendTo("body");

// 移除
$div.remove();

// $div 还没有回收, 因为我还可以再次:
$div.appendTo("body"); // 又添加到了body

// ...
// 如果$div在函数闭包内, 且后面没有引用了, remove()会回收
// 如果$div在全局环境, 如 window.$div , 则永远不会回收

这篇关于javascript - 关于 JS 垃圾回收的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆