В чем причина утечки?

Как исправить утечку памяти в этом коде? В чем причина утечки?

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);

Если вы согласны с ответом, нажмите на его левой стороне серую кнопку «галочка». Вы также можете проголосовать за ответ, нажав на серый треугольник рядом.

Kamil Kiełczewski 27.11.2018 22:44

Где ты нашел этот код? Не похоже, что вы написали это сами. Пожалуйста, дайте ссылку на источник.

Bergi 27.11.2018 23:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
32
1

Ответы 1

Проблема в том, что каждый раз, когда вы вызываете 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 (который нигде не объявлен ...)?

Bergi 27.11.2018 23:25

Другие вопросы по теме