Книга: Выразительный JavaScript
Стек вызовов
Стек вызовов
Полезным будет присмотреться к тому, как порядок выполнения работает с функциями. Вот простая программа с несколькими вызовами функций:
function greet(who) {
console.log("Привет, " + who);
}
greet("Семён");
console.log("Покеда");
Обрабатывается она примерно так: вызов greet
заставляет проход прыгнуть на начало функции. Он вызывает встроенную функцию console.log
, которая перехватывает контроль, делает своё дело и возвращает контроль. Потом он доходит до конца greet, и возвращается к месту, откуда его вызвали. Следующая строчка опять вызывает console.log
.
Схематично это можно показать так:
top
greet
console.log
greet
top
console.log
top
Поскольку функция должна вернуться на то место, откуда её вызвали, компьютер должен запомнить контекст, из которого была вызвана функция. В одном случае, console.log
должна вернуться обратно в greet
. В другом, она возвращается в конец программы.
Место, где компьютер запоминает контекст, называется стеком. Каждый раз при вызове функции, текущий контекст помещается наверх стека. Когда функция возвращается, она забирает верхний контекст из стека и использует его для продолжения работы.
Хранение стека требует места в памяти. Когда стек слишком сильно разрастается, компьютер прекращает выполнение и выдаёт что-то вроде “stack overflow” или “too much recursion”. Следующий код это демонстрирует – он задаёт компьютеру очень сложный вопрос, который приводит к бесконечным прыжкам между двумя функциями. Точнее, это были бы бесконечные прыжки, если бы у компьютера был бесконечный стек. В реальности стек переполняется.
function chicken() {
return egg();
}
function egg() {
return chicken();
}
console.log(chicken() + " came first.");
// ? ??
- Просмотр стека вызовов
- 11.3.9. Просмотр стека вызовов
- Класс стек
- 9.2.1. Более строгая реализация стека
- 3.2 Сетевой стек Windows NT
- Стеки на основе односвязных списков
- 8.6. Росписи по стеклу и керамике
- Статическое выделение памяти в стеке
- 2.2.3. Коды ошибок системных вызовов
- Глава 3 Альтернативные стеки протоколов
- Глобальное и локальное разворачивание стека
- Общие сведения о стеках протоколов