我正在阅读这篇关于javascript优化的文章。 Articlejavascript间隔内存泄漏
我遇到了这个部分,它告诉我什么时候发生泄漏。但我无法找到称呼它的正确方法,因此不会发生泄漏。这里是我感兴趣的部分。
泄漏最糟糕的地方之一是在循环或setTimeout()/ setInterval(),但这是相当普遍的。 考虑下面的例子。
var myObj = {
callMeMaybe: function() {
var myRef = this;
var val = setTimeout(function() {
console.log('Time is running out!');
myRef.callMeMaybe();
}, 1000);
}
};
如果我们再运行:
myObj.callMeMaybe();
开始计时,我们可以看到每一秒“的时间已经不多了!”如果我们再运行:
myObj = null;
计时器仍然会启动。 myObj不会被垃圾收集,因为传递给setTimeout的闭包必须保持活动才能执行。反过来,它保存对myObj的引用,因为它捕获了myRef。如果我们将闭包传递给任何其他函数,并保持对它的引用,这将是相同的。
值得一提的是,setTimeout/setInterval调用中的引用(如函数)需要在垃圾收集之前执行并完成。
问题是:你如何正确地做到这一点,使你不泄漏?这与调用clearInterval一样简单吗?这是否泄漏一次或每间隔泄漏一次
请记住'val'在函数外部不可用,所以您需要一些工厂来管理应用程序中的所有计时器。 要调用clearInterval,您需要知道'val'的值 –