Как исправить утечку памяти в этом коде? В чем причина утечки?
var theItem = null;
var replaceItem = function() {
var priorItem = theItem;
var writeToLog = function() {
if (priorItem) {
console.info("hi");
}
};
theItem = {
longStr: new Array(1000000).join('*'),
someMethod: function() {
console.info(someMessage);
}
};
};
setInterval(replaceItem, 1000);
Где ты нашел этот код? Не похоже, что вы написали это сами. Пожалуйста, дайте ссылку на источник.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что каждый раз, когда вы вызываете replaceItem, вы увеличиваете цепочку объектов, потому что эта функция внутри имеет указатель на priorItem, который указывает на результат предыдущего вызова функции, который был «сохранен» в глобальной переменной theItem (внешняя функция). Таким образом, вызов n-й функции имеет указатель на результат вызова (n-1) -й функции - и таким образом ваша цепочка указателей создается - сборщик мусора JS не очищает эту цепочку (если вы не установите для нее значение null - global theItem, и функция остановки вызова).
Объект theItem содержит someMethod, который содержит в области предыдущее значение theItem (которое содержит дальнейшее предыдущее значение ... и так далее ...).
Это будет более заметно в этот модифицированный код - когда мы отлаживаем его в chrome:
Я не знаю, какова ваша цель, но просто разорвите эту цепочку, например, удалив строку var priorItem = theItem; внутри тела функции replaceItem (а также для сохранения функциональности измените if (priorItem) { на if (theItem) {).
"эта функция внутри имеет указатель на priorItem" - э-э, только writeToLog закрывается поверх priorItem, и он не используется в объекте. someMethod объекта закрывается только поверх someMessage (который нигде не объявлен ...)?
Если вы согласны с ответом, нажмите на его левой стороне серую кнопку «галочка». Вы также можете проголосовать за ответ, нажав на серый треугольник рядом.