Замыкания в JavaScript позволяют функциям «запоминать» переменные внешнего окружения. Но если в замыкании остаются большие объекты или DOM-элементы, сборщик мусора их не очистит — это приводит к утечкам памяти.
🔹 Проблема: долгоживущие ссылки
Когда замыкание хранит объект, на который больше нет других ссылок, сборщик мусора не может его удалить, потому что замыкание всё ещё держит ссылку.
function createCache() {
const cache = { largeData: new Array(1000000).fill('*') };
return function getCache() {
return cache;
};
}
const getCache = createCache();
// cache занимает память, пока существует getCache
Здесь cache будет жить в памяти пока существует функция getCache, даже если мы больше не используем её данные.
🔹 Решение 1: функция очистки
Можно добавить метод для обнуления ссылок, чтобы GC мог очистить объект:
function createCache() {
let cache = { largeData: new Array(1000000).fill('*') };
function getCache() {
return cache;
}
getCache.cleanup = function () {
cache = null; // память освобождается
};
return getCache;
}
const getCache = createCache();
getCache.cleanup(); // теперь память под cache может быть освобождена
🔹 Решение 2: WeakMap для временных данных
Если нужно хранить состояние объектов, но не держать их в памяти навсегда, используйте WeakMap. Сборщик мусора автоматически очистит объект, когда на него не останется ссылок.
const objectData = new WeakMap();
function attachData(obj) {
objectData.set(obj, { temp: 'data' });
}
let obj = {};
attachData(obj);
obj = null; // объект и данные в WeakMap будут автоматически удалены
🔹 Резюме: как безопасно использовать замыкания
- Не храните в замыканиях лишние объекты.
- Для больших структур или временных данных используйте WeakMap/WeakSet.
- Добавляйте функции очистки (cleanup) для объектов и стейта, которые больше не нужны.
- Проверяйте память через DevTools, чтобы убедиться, что объекты удаляются.
💡 Совет для разработчиков:
Любой state или кеш, который вы храните в замыкании, должен иметь «точку выхода» — иначе ваше приложение постепенно «накопит» память, которая больше не используется.
#оптимизации #react #frontend #память #замыкания