function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
上面的例子展示了一个经典的、偶然的(或者可能不是)内存泄漏闭包。V8 垃圾收集器无法确定删除它是否安全,bigObject
因为它正在用于可以多次调用的回调函数中。
一种解决方案是设置bigObject
为null
回调函数中的作业结束的时间。但是如果你使用了很多变量(想象有n
像 一样的变量bigObject
,并且它们都在回调中使用),那么清理这将成为一个丑陋的问题。
我的问题是:还有其他方法可以清理那些使用过的变量吗?
编辑这是另一个(真实世界)示例:所以我从 mongodb 获取应用程序并将其与其他应用程序进行比较。来自 mongodb 的回调使用从该回调中定义的变量应用程序。从 mongodb 获得结果后,我也将它作为回调返回(因为它都是异步的,我不能只写 return )。所以实际上可能会发生我将回调一直传播到源......
function compareApplications(application, condition, callback) {
var model = database.getModel('Application');
model.find(condition, function (err, applicationFromMongo) {
var result = (applicationFromMongo.applicationID == application.applicationID)
callback(result)
}
}