我们在UI上使用带有时钟的Dojo创建了一个应用程序。但有时应用程序用户界面只是挂起而且时钟刚刚停止。猜测JS引擎刚刚停止,因为时钟是由javascript代码驱动的。
不确定以下代码是否会导致内存泄漏,从而导致挂起问题。我们使用递归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") + " |  " + this.dateUtil.format(d, "EEE");
window.setTimeout( function(){_this.updateTime();}, 100);
}
// ....
// ....
}
注意到在类中,updateTime方法使用window.setTimeout以递归方式调用自身来更新UI上的时间文本。
这里有没有内存泄漏问题?如果答案是否定的,是否有任何问题导致挂断问题?
谢谢!
答案 0 :(得分:2)
这不是真正的递归,因为setTimeout()
计划在将来某个时间对updateTime()
进行下一次调用,然后当前updateTime()
实际完成。因此,没有堆栈帧的堆积,因此它不是真正的递归。另外,我没有看到任何内存泄漏的原因。
你所拥有的方案应该没问题并经常使用,但是你可能希望每隔100毫秒做一次,只是为浏览器上的其他内容留出更多的CPU周期。
如果你看到时钟停止,那是因为JS引擎卡住或循环,但它可能卡在除了实际时钟代码之外的其他地方的代码中。