Що таке стек викликів (call stack)?
Стек викликів (call stack) - це структура даних, яку рушій JavaScript використовує для відстеження виконання функцій у програмі.
Принцип роботи
Коли JavaScript виконує код, він має знати:
- яка функція виконується зараз,
- звідки вона була викликана,
- куди повернутися після завершення.
Для цього використовується стек викликів - структура за принципом LIFO (Last In - First Out, останній увійшов - перший вийшов).
Як це виглядає на практиці
Приклад:
function a() {
console.log('a');
b();
}
function b() {
console.log('b');
c();
}
function c() {
console.log('c');
}
a();Покроково:
- Виклик
a()-> потрапляє в стек. Стек:[a] a()викликаєb()->b()додається. Стек:[a, b]b()викликаєc()->c()додається. Стек:[a, b, c]c()завершується -> видаляється. Стек:[a, b]b()завершується -> видаляється. Стек:[a]a()завершується -> видаляється. Стек:[](порожній)
Що станеться при нескінченній рекурсії
Якщо функція викликає сама себе без виходу:
function recurse() {
recurse();
}
recurse();Кожен виклик додається в стек, але ніколи не видаляється. У підсумку станеться "Stack overflow" (переповнення стека) - помилка, яка означає, що стек викликів переповнився.
Зв'язок з Event Loop
JavaScript однопотоковий, тобто в кожен момент часу виконується лише одна функція зі стека. Коли стек порожній, рушій може взяти наступне завдання з черги (callback queue) і почати новий цикл Event Loop.
Підсумок
| Термін | Опис |
|---|---|
| Call Stack | Місце, де рушій зберігає контекст виконання функцій |
| LIFO | Останній викликаний - перший завершений |
| Stack Overflow | Помилка при переповненні стека |
| Зв'язок з Event Loop | Коли стек порожній - обробляються колбеки та проміси |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.