請考慮以下代碼(您可以將其放入Chrome中的開發人員控制檯中並進行檢查)。Javascript/ECMAScript垃圾回收
var obj = {
f: function() {
var myRef = this;
val = setTimeout(function() {
console.log("time down!");
myRef.f();
}, 1000);
}
};
如果我再運行
obj.f();
啓動定時器,我可以看到每一秒鐘 「的時間了!」
如果我再運行
obj = null;
計時器仍然閃光。
只是好奇爲什麼垃圾收集不清除計時器?可怕的是,看起來現在沒有辦法刪除計時器 - 我正確嗎?
我的猜測是,技術上window
仍然持有對該對象的引用,因此該對象仍留在內存中。我在另一種基於ECMA的語言(Actionscript)中遇到過這個問題,並且構建了一個用於處理它的庫,但是有人認爲JavaScript會採用不同的方法。
這可能是值得檢查出的答案:http://stackoverflow.com/questions/858619/viewing-all-the-timouts-intervals-in-javascript似乎沒有辦法阻止定時器完成後就像這樣! – 2012-01-12 21:18:36
這不完全是需要特殊處理的問題 - 這是設計。如果你打算在用戶離開頁面之前停止一個定時器,那麼保存來自'setTimeout'的返回值而不是將其拋出,所以你可以使用'clearTimeout'來停止它。 – 2012-01-12 21:23:03
你真的不會在真實代碼中使用任何看起來像這樣的東西嗎?內聯函數聲明,容器對象以及從一個範圍泄漏到另一個範圍的整個組合,這些都使得代碼難以閱讀。在少數情況下,一些包裝可以解決一些問題,但這似乎並不是其中的一種。當然 – aaaaaaaaaaaa 2012-01-12 21:39:49