Проверяет понимание замыканий в JavaScript и способов освобождения удерживаемых ими ресурсов для предотвращения утечек памяти.
Замыкание возникает, когда внутренняя функция ссылается на переменные из внешней функции. Эти переменные остаются в памяти до тех пор, пока существует хотя бы одна ссылка на саму внутреннюю функцию. Если такая функция, например, назначена как обработчик события или сохранена в глобальном объекте, она продолжает удерживать весь свой лексический контекст, что может приводить к утечкам памяти.
removeEventListener с той же ссылкой на функцию.null.clearTimeout и clearInterval.function createLeak() {
const hugeData = new Array(1000000).fill('data');
const element = document.getElementById('btn');
function handler() {
console.log(hugeData.length); // замыкание удерживает hugeData
}
element.addEventListener('click', handler);
// Чтобы освободить память:
return function cleanup() {
element.removeEventListener('click', handler);
// hugeData станет недоступна после удаления handler
};
}
const cleanup = createLeak();
// ... позже
cleanup(); // удаляем обработчик, замыкание и hugeData собираются GC
Важно понимать, что простое обнуление переменной внутри замыкания не поможет, если на функцию всё ещё есть внешняя ссылка. Необходимо именно удалить все ссылки на функцию, чтобы сборщик мусора мог её удалить.
В современных движках JavaScript (V8, SpiderMonkey) сборщик мусора достаточно умён, чтобы не удерживать переменные, которые больше не используются внутри замыкания, но полагаться на это не стоит. Явное управление ссылками — надёжный способ избежать утечек.
Итог: применяйте удаление обработчиков, обнуление ссылок и очистку таймеров, когда замыкание больше не нужно. Это особенно важно в одностраничных приложениях и при работе с DOM, где утечки накапливаются и приводят к замедлению работы.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию