我正在閱讀這篇關於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'的值 –