2011-05-27 52 views
2

此代碼是否創建任何內存泄漏?或者代碼有什麼問題?這個setTimeout是否會產生任何內存泄漏?

HTML:

<div id='info'></div> 

的Javascript:

var count = 0; 

function KeepAlive() 
{ 
    count++; 

    $('#info').html(count); 
    var t=setTimeout(KeepAlive,1000); 
} 
KeepAlive(); 

運行此測試: http://jsfiddle.net/RjGav/

+0

我不確定如果以您描述的方式使用'setTimeout'會導致內存泄漏。如果你想單獨測試內存泄漏,你可以嘗試一些東西 - 但是如果你選擇嘗試,請記住不同的瀏覽器由於不同的原因以不同的方式泄漏。 – DavidJCobb 2011-05-27 18:05:07

回答

5

你應該使用的setInterval來代替:

var count = 0; 

function KeepAlive() { 
    $('#info').html(++count); 
} 

var KAinterval = setInterval(KeepAlive, 1000); 

如果您需要致電clearInterval(KAinterval);,您可以取消它。

+0

感謝g.d.d.c +1 ...有什麼理由不在KAinterval前面使用var?就是想。 – capdragon 2011-05-27 18:18:11

+0

@capdragon - 一個錯字。接得好。 – 2011-05-27 18:42:37

5

我認爲這會泄漏,因爲連續的引用永遠不會被釋放。也就是說,第一次調用通過引用自身內部的函數立即創建閉包。當它再次調用自己時,新引用來自在第一次迭代中創建的實例,因此第一次可能再也不會被釋放。

你可以通過改變間隔爲非常小的測試這個理論很容易地和觀看鉻內存...

(編輯),理論與小提琴測試,其實,我錯了,它不」至少在Chrome中是不漏的。但這並不能保證其他一些瀏覽器(例如較老的IE)不擅長垃圾收集。

但是否泄漏,沒有理由不使用setInterval代替。

2

很高興有setInterval方法如g.d.d.c提到過。
此外,最好將$('#info')存儲在函數外的變量中。

結帳http://jsfiddle.net/RjGav/1/

+0

謝謝,請您詳細說明爲什麼在函數外部存儲變量更好...您發佈的jsfiddle鏈接也不會運行。 – capdragon 2011-05-27 18:09:54

+1

更正了代碼:http:// jsfiddle。net/RjGav/2/ – 2011-05-27 18:10:52

+3

$('#info')'每次運行時都會運行,這是不需要的,因爲從它返回的值永遠不會改變。通過將此調用移到該函數之外,可以避免這種不必要的計算。 – 2011-05-27 18:13:42

3

這不應該創建一個泄漏,因爲KeepAlive功能將及時完成,從而釋放該函數的所有變量。此外,在您當前的代碼中,沒有任何理由設置t var,因爲它未被使用。如果你想用它來取消你的事件,你應該在更高的範圍內聲明它。

除此之外,我沒有看到你的代碼有任何「錯誤」,但這取決於你正在嘗試做什麼。例如,如果您嘗試將此用作精確計時器,則它將比常規時鐘慢。因此,您應該考慮在頁面加載時設置日期,並在需要時計算差異,或者使用setInterval作爲建議的g.d.d.c。

+0

非常感謝+1。 – capdragon 2011-05-27 18:19:03