Выбор ответа Middle Память и сборка мусора обновлено

Замыкание держит большой объект

Вопрос

Обработчик живёт долго, а report занимает сотни мегабайт. Как удержать в памяти только нужное?

function attach(button, report) {
  button.addEventListener('click', () => {
    console.log(report.rows.length);
  });
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Заранее вычислить const count = report.rows.length и замкнуть только count. Замыкание держит переменные, которые использует, а report используется целиком: пока обработчик подписан, весь отчёт достижим.

Варианты ответа

  1. Ничего не делать: движок сам замкнёт только report.rows.length, без отчёта
  2. Заменить стрелку на обычную функцию, она не захватывает внешние объекты
  3. Объявить report через var, тогда замыкание не будет держать его в памяти
  4. Заранее вычислить const count = report.rows.length и замкнуть только countправильный ответ

Разбор

Замыкание держит переменные, которые использует, а report используется целиком: пока обработчик подписан, весь отчёт достижим. Если заранее вычислить число и замкнуть только его, ссылка на report из обработчика пропадёт, и отчёт сможет освободиться (если на него нет других ссылок). Движок не выделяет из объекта отдельное поле сам. Вид функции и var на удержание не влияют.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.