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

Posted

技术标签:

【中文标题】在 JavaScript 中调用/执行后是不是需要删除回调函数?【英文标题】:Is it necessary to delete callback function after being called/executed in JavaScript?在 JavaScript 中调用/执行后是否需要删除回调函数? 【发布时间】:2012-12-15 16:05:10 【问题描述】:

我有一个网络应用程序,它定期向 3rd 方服务(例如 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 将变得臃肿,因为旧的或已经执行的回调。 Mu 的问题是,我是否需要创建一种机制来垃圾收集那些已被执行且不再需要的人?

【问题讨论】:

【参考方案1】:

您不一定需要删除旧的回调,如果您只会在每个页面上进行几次调用,但如果您的页面运行时间很长并且反复进行调用,这可能是一个不错的选择删除它们的想法。

“机制”可以很简单

delete self.fn[id];

调用函数后。

【讨论】:

好的,感谢您的评论。我确实在我当前的代码库中删除了它们。我只是在寻找验证是否真的有必要,否则它们会在一段时间后被浏览器自动垃圾收集。干杯伙伴! 只要您持有对它们的引用,它们就不会被垃圾收集。 delete 删除引用允许垃圾收集器最终删除函数。

以上是关于在 JavaScript 中调用/执行后是不是需要删除回调函数?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 函数定义方法

javascript异步回调

使用 JavaScript 在特定延迟后执行脚本

仅在 javascript 循环完成后执行 ajax 调用

如何在 Ajax 加载后执行 javascript?

JavaScript 中怎么不带括号的调用函数