2016-12-05 6 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; 
} 

私はちょうどタイマーとフィドルのタイマのdiv要素を再現しています。 chromeの開発ツールを開いてタイムラインを記録すると、毎秒新しいノードがメモリに追加されることがわかります。 24時間放置すると、毎日新しいノードが追加され、収集されることはありません。

これはガベージコレクトされていない理由がかなり分かりませんが、メモリの割り当てを解除するにはどうすればよいですか?

+0

の変数t外を宣言あなたはsetTimeout' 'の' timer'参照および使用を参照していますか?期待される結果は何ですか?また、 'timer'を呼び出すたびに' jQuery() 'を呼び出しています。 – guest271314

+0

ガベージコレクタはどのように接続されていますか?どのようなゴミを収集する必要がありますか? –

+0

あなたは '.text()'を変更する前に '.empty()'を呼び出そうとしましたか? – Steve

答えて

1

#timerへの参照を作成して、を呼び出して、timerを呼び出すたびに呼び出してください。また、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( '});')は、 'timer'のスコープに' const time 'を入れるためにブロックの最後に移動する必要があります:-) – traktor53

+0

@ Traktor53 Updated – guest271314

関連する問題