我试图编写一个含有内存泄漏的 JavaScript 代码,以便与 Chrome 中的分析器一起使用。然而,似乎分析器没有展示应该展示的内容。
这是我的代码:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="start_button">Start</button>
<button id="destroy_button">Destroy</button>
<script type="text/javascript" charset="utf-8">
var Leaker = function(){};
Leaker.prototype = {
init:function(){
this._interval = null;
this.start();
},
start: function(){
var self = this;
this._interval = setInterval(function(){ self.onInterval(); }, 100);
},
onInterval: function(){ console.log("Interval"); }
};
$("#start_button").click(function(){
if(leak !== null && leak !== undefined){
return;
}
leak = new Leaker();
leak.init();
});
$("#destroy_button").click(function(){
leak = null;
});
var leak;
</script>
当我点击开始按钮时,会创建一个新的对象Leaker。而当我点击销毁按钮时,该对象将被设置为null(注意:但它不会被垃圾收集,因为setInterval仍在工作)。
问题:然而,当我使用Google Chrome分析器时,它并没有显示任何对我的Leaker实例的引用,即使在我点击销毁后(但它应该显示这样的引用,因为如上所述,setInterval的闭包仍然保留着它)。
在点击销毁按钮后的分析器(您可以看到我再也找不到leaker实例了,而它应该还在那里)。
这里是控制台,尽管分析器显示我们没有Leaker实例了,但setInterval仍然在运行。
我是否在垃圾回收的工作方式或Chrome分析器方面遗漏了什么?