Стек — это LIFO-структура (Last In, First Out), где хранятся примитивы и ссылки на объекты в Heap.
function foo() {
let x = 10; // Примитив хранится в стеке
bar();
}
function bar() {
let y = 20; // Еще один фрейм
}
foo(); // Стек: [foo] -> [foo, bar] -> [foo] -> []
Особенности:
RangeError: Maximum call stack size exceeded
).Динамическая область памяти для хранения объектов (ссылочные типы).
let user = { name: "Alice" }; // Объект в Heap, ссылка `user` — в стеке
let arr = [1, 2, 3]; // Аналогично
Проблемы:
let button = document.getElementById('btn');
button.onclick = () => console.log("Clicked"); // Утечка, если кнопка удалена из DOM
JavaScript использует автоматическую сборку мусора (например, алгоритм Mark-and-Sweep):
let obj1 = { ref: null };
let obj2 = { ref: null };
obj1.ref = obj2; // Ссылка друг на друга
obj2.ref = obj1;
// Если убрать внешние ссылки, сборщик мусора удалит их (современные алгоритмы справляются с циклами)
ngOnDestroy() {
this.subscription.unsubscribe(); // Иначе утечка памяти
}
OnPush
Change Detection: уменьшает количество проверок объектов.@HostListener('click', ['$event'])
onClick(event: Event) { ... } // Angular автоматически управляет подпиской
P.S. Для анализа памяти используйте Chrome DevTools → Memory Snapshot.