Call Stack - это структура данных LIFO (Last In, First Out), которая отслеживает текущее положение выполнения кода. Когда функция вызывается, она помещается в стек, а когда завершается - удаляется из него.
Пример работы:
function greet() {
console.log('Hello!');
}
function welcome() {
greet();
console.log('Welcome!');
}
welcome();
Порядок выполнения:
welcome()
добавляется в стекgreet()
добавляется в стек (внутри welcome
)console.log('Hello!')
добавляется в стек (внутри greet
)console.log('Hello!')
выполняется и удаляется из стекаgreet()
завершается и удаляется из стекаconsole.log('Welcome!')
добавляется в стекconsole.log('Welcome!')
выполняется и удаляется из стекаwelcome()
завершается и удаляется из стекаTask Queue (или Callback Queue) - это очередь FIFO (First In, First Out), где хранятся асинхронные callback-функции, ожидающие выполнения.
Пример работы с setTimeout:
console.log('Start');
setTimeout(() => {
console.log('Timeout callback');
}, 0);
console.log('End');
Порядок выполнения:
console.log('Start')
выполняется сразуsetTimeout
регистрируется в Web API, таймер начинает отсчетconsole.log('End')
выполняетсяconsole.log('Timeout callback')
выполняетсяОтдельно существует Microtask Queue для Promise и других микротасок, которые имеют приоритет над Task Queue.
Пример:
console.log('Script start');
setTimeout(() => {
console.log('setTimeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('Script end');
Порядок выполнения:
В Angular зона (NgZone) отслеживает асинхронные операции и инициирует обнаружение изменений. Важные особенности:
Пример Angular-специфичного поведения:
this.http.get('/data').subscribe(() => {
console.log('HTTP done'); // Вызовет change detection
});
setTimeout(() => {
this.value = 'Updated'; // Также вызовет change detection
}, 1000);
Понимание этого механизма критически важно для Angular-разработчика, так как влияет на: