关于 JS 垃圾回收的问题

代码说明一切

核心代码

Q:

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

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

var a = new A;
a = null;

附上完整可运行代码:

<!DOCTYPE html>
<html> <head> <style> .div { width: 160px; box-shadow: 0 1px 2px rgba0, 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.onclick, function { alertClicked Me!; }; } } new A.addListener;
</script>
</body> </html>

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

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

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

所以, 如果是用$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 , 则永远不会回收

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

var a = A;
a.addListener;
a = null;
/* 将 .div 从 Dom 删除的代码... */

发表评论

电子邮件地址不会被公开。 必填项已用*标注