Выбор ответа Middle Области видимости и замыкания обновлено

Замыкание и память

Вопрос

Какое утверждение о замыканиях и памяти верное?

function setup(button) {
  const bigData = new Array(1e6).fill('*');
  button.addEventListener('click', () => {
    console.log(bigData.length);
  });
}

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

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

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

Коротко

Правильный ответ: bigData живёт, пока обработчик подписан на достижимую кнопку. Обработчик использует bigData, значит его окружение живо, пока жив обработчик.

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

  1. bigData освободится сразу после выхода из setup, как локальная переменная
  2. bigData освободится после первого клика, когда обработчик отработает
  3. bigData живёт, пока обработчик подписан на достижимую кнопкуправильный ответ
  4. Замыкания копируют данные, поэтому массив будет занимать память дважды

Разбор

Обработчик использует bigData, значит его окружение живо, пока жив обработчик. Обработчик живёт, пока подписан на достижимую кнопку. Освободить память можно через removeEventListener или удалив кнопку и все ссылки на неё. Клик ничего не меняет: обработчик продолжает висеть. Копирования нет, замыкание держит ссылку на то же окружение.

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

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