在Dojo类中递归调用setTimeout时是否存在内存泄漏

Is there memory leak when doing recursively setTimeout invoke within a Dojo class?

本文关键字:是否 存在 内存 泄漏 setTimeout 调用 Dojo 递归      更新时间:2023-09-26

我们使用Dojo创建了一个应用程序,UI上有一个时钟。但有时应用程序UI会挂断,时钟也会停止。猜测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") + " &nbsp;|&nbsp " + this.dateUtil.format(d, "EEE");
    window.setTimeout( function(){_this.updateTime();}, 100);
}
// ....
// ....
}

注意到在类中,updateTime方法使用window.setTimeout递归调用自己来更新UI上的时间文本。

这里有内存泄漏问题吗?如果答案是否定的,是否有任何可能的问题导致挂断问题?

谢谢!

这并不是真正的递归,因为setTimeout()会在未来一段时间内调度对updateTime()的下一次调用,然后当前的updateTime()实际完成。因此,没有堆栈框架的构建,因此它并不是真正的递归。此外,我看不出有任何原因导致内存泄漏。

你的方案应该是可以的,而且经常使用,但你可能想把它的频率降低到每100毫秒一次,只是为了给浏览器上的其他事情留出更多的CPU周期。

如果你看到时钟停止,那是因为JS引擎被卡住或循环,但它可能被卡在了实际时钟代码之外的其他地方。