背景
早在五月份,我在WebKit上报告了一个关于memory retention issue的问题。看起来这个问题可能是由于Web Inspector本身造成的,但我还是不相信。
问题
一个问题浮出水面,我的JavaScript应用程序实现了一个“Polling Consumer”模式,用于在数据可用时获取数据。问题在于记忆被保留并在一天中增长。 JavaScript逻辑如下:
这是在JavaScript中实现轮询使用者的合理方式吗?顺便说一下,我正在使用jQuery的ajax函数,当然这可能有它自己的问题。另外我使用jQuery代理作为成功处理程序,所以我认为通过范围保留应该不是问题。我没有使用代理也观察到了这个问题。一些代码:
FidsDataController.prototype.getFids = function() {
var self = this;
$.ajax({
...
success: function(data) {
// Do some processing
// Call back in a short while...
setTimeout($.proxy(self.getFids, self), 100);
},
...
});
);
答案 0 :(得分:1)
你只有getFids
的一个副本,这很好,但是每次调用它都会创建两个新函数:一个用于成功处理程序,另一个用于$.proxy
调用。这两个函数并非每次调用都是唯一的。将它们放在可重复使用的变量中,您将节省大量额外的功能,这可以大大降低您的内存泄漏潜力。
我们在构造函数中为每个对象创建每个函数的代理版本的示例。重复调用不会产生更多功能:
function FidsDataController() {
// ...constructor...
// Proxy these functions just once from the prototype
this.getFids = $.proxy(this.getFids, this);
this._getFids_success = $.proxy(this._getFids_success, this);
}
FidsDataController.prototype.getFids = function() {
var self = this;
$.ajax({
success: this._getFids_success;
});
};
FidsDataController.prototype._getFids_success = function(data) {
// processing of data
setTimeout(this.getFids, 100);
};