Выбор ответа Middle Память и сборка мусора обновлено
Замыкание держит большой объект
Вопрос
Обработчик живёт долго, а report занимает сотни мегабайт. Как удержать в памяти только нужное?
function attach(button, report) {
button.addEventListener('click', () => {
console.log(report.rows.length);
});
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Заранее вычислить const count = report.rows.length и замкнуть только count. Замыкание держит переменные, которые использует, а report используется целиком: пока обработчик подписан, весь отчёт достижим.
Варианты ответа
- Ничего не делать: движок сам замкнёт только
report.rows.length, без отчёта - Заменить стрелку на обычную функцию, она не захватывает внешние объекты
- Объявить
reportчерезvar, тогда замыкание не будет держать его в памяти - Заранее вычислить
const count = report.rows.lengthи замкнуть толькоcountправильный ответ
Разбор
Замыкание держит переменные, которые использует, а report используется целиком: пока обработчик подписан, весь отчёт достижим. Если заранее вычислить число и замкнуть только его, ссылка на report из обработчика пропадёт, и отчёт сможет освободиться (если на него нет других ссылок). Движок не выделяет из объекта отдельное поле сам. Вид функции и var на удержание не влияют.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.