2017-03-24 6 views
0

この問題についてはここで質問と回答がたくさんあることはわかっていますが、それが本当に鉱山のケースに当てはまるかどうかはわかりません。JS setInterval()mem leak

私はsetIntervalの機能を持つタイムスクリプトを持っています。最初の分はうまくいきますが、クロム/オペラタスクマネージャーでは、このスクリプトのタブが40MBから2GBに移動しています。それは狂気だし、私はそれを修正する方法を知らない。すべてのスクリプトを別の方法で書き直す場合のみ。

スクリプト:あなたが再帰的に繰り返しているupdateTimeを呼び出すsetIntervalを使用してupdateTime機能を呼び出している

function checkTime(i) { 
    return (i < 10) ? "0" + i : i; 
}; 

function calcTime(city, offset) { 
    d = new Date(); 
    utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
    nd = new Date(utc + (3600000*offset)), 
     h = checkTime(nd.getHours()), 
     m = checkTime(nd.getMinutes()), 
     s = checkTime(nd.getSeconds()); 
    return nd.toLocaleString(); 
}; 

function updateTime() { 
    if (document.getElementById('timeMoscow')) { 
     calcTime('Moscow', '+3'); 
     document.getElementById('timeMoscow').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    if (document.getElementById('timeKiev')) { 
     calcTime('Kiev', '+2'); 
     document.getElementById('timeKiev').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } else 
    if (document.getElementById('timeAstana')) { 
     calcTime('Astana', '+6'); 
     document.getElementById('timeAstana').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    if (document.getElementById('timeNewYork')) { 
     calcTime('NewYork', '-4'); 
     document.getElementById('timeNewYork').innerHTML = h + ":" + m /*+ ":" + s*/; 
    } 
    setInterval(updateTime, 500); //Problem 
} 

updateTime(); 
+0

は、私はstackoverflowの参照:) – abhishekkannojia

+0

は '自動的に繰り返すsetInterval'、あなたはそれを再コールする必要はありません。あなたは 'setTimeout'と混同しています。 – JJJ

+0

あなたは再帰的にintervalを設定しています。これは 'updateTime'を呼び出します。これは' updateTime'を呼び出すIntervalを再び設定し、メモリが足りなくなるまで何度も繰り返されます。 – abhishekkannojia

答えて

2

。メソッドからsetInterval()呼び出しを削除し、それを呼び出すようにしてください。

function updateTime() { 
    //You rest of code 
} 

setInterval(updateTime, 500); 
+0

ありがとうございました。 – KAYOver