function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
上記の例は、古典的な偶発的な (またはそうでない可能性がある) メモリ リーク クロージャを示しています。V8 ガベージ コレクターは、bigObject
複数回呼び出すことができるコールバック関数で使用されているため、安全に削除できるかどうかを判断できません。
1 つの解決策は、コールバック関数でジョブが終了したときにを設定bigObject
することです。null
しかし、多くの変数を使用している場合 ( のn
ような変数がbigObject
あり、それらはすべてコールバックで使用されていると想像してください)、これをきれいにするのは厄介な問題になります。
私の質問はこれです: これらの使用済み変数をきれいにする他の方法はありますか?
EDIT別の (実世界の) 例を次に示します。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)
}
}