← Назад к вопросам

По каким правилам задачи попадают в стек вызовов

1.0 Junior🔥 261 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стек вызовов (Call Stack) в JavaScript

Стек вызовов — это структура данных, которая отслеживает выполнение функций. Когда функция вызывается, она добавляется в вершину стека, когда завершается — удаляется. JavaScript однопоточный язык, поэтому в один момент времени может выполняться только одна функция.

Правило LIFO (Last In, First Out)

Это фундаментальное правило стека вызовов — последняя добавленная функция удаляется первой:

function first() {
  second();
  console.log("first");
}

function second() {
  third();
  console.log("second");
}

function third() {
  console.log("third");
}

first();
// Порядок выполнения:
// third (добавлена последней, выполняется первой)
// second
// first

Как это работает в стеке:

  1. first() добавляется в стек
  2. Внутри first вызывается second() — добавляется в стек
  3. Внутри second вызывается third() — добавляется в стек
  4. third() завершается — удаляется из стека
  5. second() завершается — удаляется из стека
  6. first() завершается — удаляется из стека

Синхронное и асинхронное выполнение

Зачастую путают стек вызовов с очередью задач (Task Queue) и микрозадач (Microtask Queue). Важно: асинхронный код НЕ добавляется прямо в стек!

console.log("Start");

setTimeout(() => {
  console.log("Timeout");
}, 0);

Promise.resolve().then(() => {
  console.log("Promise");
});

console.log("End");

// Вывод:
// Start
// End
// Promise (микротаск выполняется раньше макротаска)
// Timeout

Стек вызовов и глобальный контекст

При запуске скрипта в стеке создаётся глобальный контекст выполнения (Global Execution Context), в котором находятся все синхронные функции:

// Global EC добавлен в стек
function outer() {
  function inner() {
    return 42;
  }
  return inner(); // inner добавляется в стек
}

outer(); // outer добавляется в стек

Переполнение стека (Stack Overflow)

Если функция вызывает саму себя без условия выхода, стек переполняется:

function infinite() {
  infinite(); // вызов себя
}

infinite(); // RangeError: Maximum call stack size exceeded

Правила попадания в стек

  1. Функция вызывается — немедленно добавляется в стек
  2. Синхронное выполнение — остаётся в стеке до завершения
  3. Return или конец функции — удаляется из стека
  4. Асинхронный код (setTimeout, Promise, fetch) — НЕ добавляется в стек сразу, идёт в очередь задач
  5. Callback-и — выполняются только когда стек пуст

Понимание стека вызовов критично для отладки, понимания порядка выполнения и диагностики проблем с производительностью в JavaScript приложениях.