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

标签 javascript memory dojo settimeout memory-leaks

我们已经使用 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 引擎卡住或循环,但它可能卡在实际时钟代码以外的其他地方的代码中。

关于javascript - 在 Dojo 类中递归调用 setTimeout 时是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12208253/

相关文章:

jquery - 我缺少什么? jQuery 和 Dojo 中的链接 promise

javascript - 将多张照片发布到一个帖子

javascript - 在javascript中使用https路径下载pdf文件

javascript - React 应用程序中的失败测试

java - 用于列出 Java 程序内存中的变量名称和值的脚本或程序(内存快照)

java - 如何在域 bean 之外实现 Jackson 自定义序列化?

javascript - 如何在 Javascript 和 JSF 中使用数据库?

c - malloc/memcpy 函数在 NUMA 上独立运行吗?

ruby-on-rails - Rails 应用程序中的内存泄漏......字符串噩梦

javascript - 尝试在 ajax 加载上显示 gif 时,Dojo "TypeError {stack: (...), message: "未定义不是函数"}"