2012-08-31 17 views
4

我們使用Dojo在UI上創建了一個使用時鐘的應用程序。但是有時應用程序用戶界面只是掛在那裏,時鐘剛剛停止。猜測JS引擎剛剛停止,因爲時鐘是由JavaScript代碼驅動的。在Dojo類中進行遞歸調用setTimeout時是否有內存泄漏?

不確定下面的代碼會導致內存泄漏,然後導致掛斷問題。我們使用遞歸的setTimeout調用來實現時鐘。

dojo.declare("xxx.xxx.HomepageHeader", [dijit._Widget, dijit._Templated], 
{ 
widgetsInTemplate: true, 
_time :'', 
dateUtil: null, 

// .... 
// .... 

prefix :function (value, p) 
{ 
    return (value < 10) ? p + value : value; 
}, 

updateTime :function() 
{ 
    var d = new Date(); 
    var _this = this; 
    var t = [_this.prefix(d.getHours(), '0'), _this.prefix(d.getMinutes(), '0'), _this.prefix(d.getSeconds(), '0')].join(':'); 
    _this._time.innerHTML = t; 
    _this.dateInfo.innerHTML = this.dateUtil.format(d, "yyyy/MM/dd") + " &nbsp;|&nbsp " + this.dateUtil.format(d, "EEE"); 
    window.setTimeout(function(){_this.updateTime();}, 100); 
} 

// .... 
// .... 
} 

注意到在類中,方法updateTime使用了window.setTimeout來遞歸地調用它自己來更新UI上的時間文本。

這裏是否有任何內存泄漏問題?如果答案是否定的,是否有任何可能的問題導致掛斷問題?

謝謝!

回答

1

這不是真正的遞歸,因爲setTimeout()將在未來一段時間內調度updateTime(),然後當前updateTime()實際完成。所以,沒有堆棧框架的建立,因此它不是真正的遞歸。此外,我沒有看到任何內存泄漏的原因。

你的計劃應該是正常的,並且經常使用,但是你可能希望這樣做的次數少於每100ms,只是爲瀏覽器上的其他事情留下更多的CPU週期。

如果你看到時鐘停止,這是因爲JS引擎卡住或循環,但它可能停留在除了實際時鐘代碼以外的其他地方的代碼。