首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >javascript中的闭包和回调内存泄漏

javascript中的闭包和回调内存泄漏
EN

Stack Overflow用户
提问于 2013-05-08 21:36:46
回答 2查看 8.4K关注 0票数 18
代码语言:javascript
复制
function(foo, cb) {
  var bigObject = new BigObject();
  doFoo(foo, function(e) {
     if (e.type === bigObject.type) {
          cb();
          // bigObject = null;
     }
  });
}

上面的例子展示了一个典型的、意外的(也可能不是)内存泄漏闭包。V8垃圾收集器无法确定删除bigObject是否安全,因为它正在回调函数中使用,回调函数可能会被多次调用。

一种解决方案是在回调函数中的作业结束时将bigObject设置为null。但是如果你使用了很多变量(假设有像bigObject这样的n变量,并且它们都在回调中使用),那么清理它就成了一个丑陋的问题。

我的问题是:有没有其他方法来清理这些使用过的变量?

编辑mongodb这是另一个(真实世界)示例:我从获取应用程序,并将其与其他应用程序进行比较。来自mongodb回调使用在回调中定义的变量application。在我从mongodb获得结果后,我也会将其作为一个回调返回(因为它是异步的,我不能只写return )。所以实际上我可能会将回调一直传播到源代码...

代码语言:javascript
复制
function compareApplications(application, condition, callback) {

    var model = database.getModel('Application');
    model.find(condition, function (err, applicationFromMongo) {
        var result = (applicationFromMongo.applicationID == application.applicationID)
        callback(result)        
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-05-08 21:40:58

如果你的回调函数应该只被调用一次,那么你应该在它被调用后取消订阅。这将把你的回调+闭包释放给GC。随着你的闭包的发布,bigObject也将被GC免费收集。

这是最好的解决方案-正如您所提到的,GC不会神奇地知道您的回调只会被调用一次。

票数 2
EN

Stack Overflow用户

发布于 2015-04-01 00:12:27

以Brandon的回答为基础:如果(由于某些可怕的原因)你无法取消订阅回调,你总是可以自己处理删除回调:

代码语言:javascript
复制
function createSingleUseCallback(callback)
{
    function callbackWrapper()
    {
        var ret = callback.apply(this, arguments);
        delete callback;
        return ret;
    }
    return callbackWrapper;
}

function compareApplications(application, condition, callback)
{
    var model = database.getModel('Application');
    model.find(condition, createSingleUseCallback(function (err, applicationFromMongo)
    {
        var result = (applicationFromMongo.applicationID == application.applicationID);
        callback(result);
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16442201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档