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
, и все они используются в обратном вызове), то очистка становится уродливой проблемой.
Мой вопрос таков: есть ли другой способ очистить используемые переменные?
EDIT Вот еще один пример (реальный мир): поэтому я получаю приложение от mongodb и сравниваю его с каким-либо другим приложением. Обратный вызов от mongodb использует переменное приложение, которое определено из этого обратного вызова. После получения результата от mongodb я возвращаю его также как обратный вызов (потому что это все async, и я не могу просто написать 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)
}
}