在JavaScript中调用/执行后是否需要删除回调函数?

时间:2012-12-31 14:08:44

标签: javascript memory-management callback garbage-collection jsonp

我有一个网络应用程序,定期轮询第三方服务(比如Facebook,Twitter等)的数据。 此轮询/请求是通过JSONP进行的(以避免跨域问题)。

例如,一个简单的请求就是这样的:

function jsonp_callback() {
    // Do something
}

var url = 'http://some.service.com/getresult?callback=jsonp_callback';
$http.jsonp(url);

但是,由于可以在任何给定时间进行其他类型的请求(例如:发送或发布更新),我创建了一个包装器来处理回调。

实现是这样的:

// Callback handler
var myCb = (function() {
    var F = function() {};
    F.prototype.fn = {};
    F.prototype.create = function(fn, scope) {
        var self = this;
        var id = new Date().getTime();
        self.fn[id] = function() {
            if (typeof fn === 'function') {
                fn.call(scope);
            }
        }
        return 'myCb.fn.' + id;
    }
    return new F();
})();

// JSONP request
var cb = myCb.create(function() {
    // Do something
});
var url = 'http://some.service.com/getresult?callback=' + cb;
$http.jsonp(url);

如果您注意到,经过一段时间后, myCb.fn 将会膨胀旧回调或已经执行过的回调。 问题是,我是否需要创建一种机制来垃圾收集已被执行但不再需要的人?

1 个答案:

答案 0 :(得分:4)

你不一定需要来删除旧的回调,如果你每页只打几个电话,但如果你的页面是一个长期运行的并重复拨打电话那么它可能是一个好的删除它们的想法。

“机制”可以像

一样简单
delete self.fn[id];

调用函数后。