2016-12-05 52 views
1

我正在創建一個單頁應用程序,該應用程序將在瀏覽器中一次保持活動狀態並一次打開多個日期。在此頁面上,我在右上角顯示一個計時器。但是,我發現我使用計時器的方式泄漏了少量的內存。使用jQuery.text()導致內存泄漏

https://jsfiddle.net/zbgonp84/

$(function(){ 
    timer(); 
}); 
function timer(){ 
    var today = new Date(); 
    var h = today.getHours(); 
    var m = today.getMinutes(); 
    var s = today.getSeconds(); 
    m = checkTime(m); 
    s = checkTime(s); 
    $("#timer").text(h + ":" + m + ":" + s); 
    var t = setTimeout(timer, 1000); 
} 

function checkTime(i) { 
    if (i < 10){ 
     i = "0" + i; 
    } 
    return i; 
} 

我已經重新只是定時器,定時器在小提琴股利。如果您打開chrome的開發工具並記錄時間線,則可以看到每秒鐘都有一個新節點添加到內存中。如果放置24小時,它將在整個一天中每秒添加一個新節點,並且永遠不會收集。

我覺得好像我錯過了一些相當明顯的事情,爲什麼這不是被垃圾收集,但是我錯過了什麼來分配內存?

+0

你指的是'timer'的引用和setTimeout'的使用嗎?預期的結果是什麼?您每次調用'timer'時都會調用'jQuery()'。 – guest271314

+0

如何連接垃圾收集器?它應該收集哪些垃圾? –

+0

您是否曾嘗試在更改'.text()'前調用'.empty()'' – Steve

回答

1

在每次調用timer時創建並替換對#timer元素的引用以呼叫jQuery()timer

$(function() { 
    const time = $("#timer"); 
    var t; 
    timer(); 

    function timer() { 
    var today = new Date(); 
    var h = today.getHours(); 
    var m = today.getMinutes(); 
    var s = today.getSeconds(); 
    m = checkTime(m); 
    s = checkTime(s); 
    time.text(h + ":" + m + ":" + s); 
    t = setTimeout(timer, 1000); 
    } 

    function checkTime(i) { 
    if (i < 10){ 
     i = "0" + i; 
    } 
    return i; 
    } 
}); 
+0

調整我的代碼以使用它也可以節省我的擔心,我的內存將增加太多。謝謝! – Jermaya

+1

第5行('});')可能需要移動到塊的末尾以將'const time'放在'timer'的範圍內:-) – traktor53

+0

@ Traktor53已更新 – guest271314