在Dojo类中递归调用setTimeout时是否存在内存泄漏
Is there memory leak when doing recursively setTimeout invoke within a Dojo class?
我们使用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") + " |  " + this.dateUtil.format(d, "EEE");
window.setTimeout( function(){_this.updateTime();}, 100);
}
// ....
// ....
}
注意到在类中,updateTime方法使用window.setTimeout递归调用自己来更新UI上的时间文本。
这里有内存泄漏问题吗?如果答案是否定的,是否有任何可能的问题导致挂断问题?
谢谢!
这并不是真正的递归,因为setTimeout()
会在未来一段时间内调度对updateTime()
的下一次调用,然后当前的updateTime()
实际完成。因此,没有堆栈框架的构建,因此它并不是真正的递归。此外,我看不出有任何原因导致内存泄漏。
你的方案应该是可以的,而且经常使用,但你可能想把它的频率降低到每100毫秒一次,只是为了给浏览器上的其他事情留出更多的CPU周期。
如果你看到时钟停止,那是因为JS引擎被卡住或循环,但它可能被卡在了实际时钟代码之外的其他地方。
相关文章:
- 用于检查数组中是否存在元素的javascript自定义方法
- 是否存在React Native“;WEB代码安全防护”;
- 验证会话中是否存在对象's数组
- 如何查找值是否存在于二叉树中
- 检查是否存在使用chrome扩展的javascript库
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- 测试mongo脚本中是否存在参数
- 检查搜索结果是否存在多次如果是,则在Javascript中只显示一个结果
- 检查数组中是否存在字符串值,并返回找到的数组值js
- 如何通过json对象选项卡中的Id来检查对象是否存在
- 检查是否存在任意控制器/操作
- Javascript滑块不滑动,如何判断是否存在JS冲突
- 根据手机上是否存在文件,在jQuery mobile中动态填充列表视图
- javascript测试是否存在两个标志中的任何一个
- 如何使用javascript检查移动sd卡中是否存在文件
- 当提供函数名称时,检查函数是否存在于同一作用域中
- 需要帮助使用JQuery.inArray()检查值是否存在
- 确定元素是否存在
- 使用javascript检查服务器上是否存在html文件
- 是否存在类似ExtJS 4的框架;正常的“;网站