2016-12-05 50 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