Найти в Дзене
Стать программистом

Стек вызовов в JS

Определенное влияние оказывает способ прохождения контроля через функции. Давайте посмотрим поближе. Вот простая программа, которая выполняет несколько вызовов функций: function greet(who) { console.log("Hello " + who); } greet("Harry"); console.log("Bye"); Выполнение этой программы происходит примерно так: вызов приветствия приводит к тому, что управление переходит к запуску этой функции (строка 2). Функция вызывает console.log , которая берет управление в свои руки, делает свою работу, а затем возвращает управление на строку 2. Там он доходит до конца функции greet, так что возвращается в место, которое вызвало его, то есть до четвертой строки. Линия после этого снова вызывает console.log. После этого программа доходит до конца. Можно схематично показать поток управления следующим образом: не в function в greet в console.log в greet не в function в console.log не в function Поскольку при возвращении функция должна возвращаться в то место, откуда она была вызван
Оглавление
https://present5.com/presentation/-101735968_438633028/image-27.jpg
https://present5.com/presentation/-101735968_438633028/image-27.jpg

Определенное влияние оказывает способ прохождения контроля через функции. Давайте посмотрим поближе. Вот простая программа, которая выполняет несколько вызовов функций:

function greet(who) {
console.log("Hello " + who);
}
greet("Harry");
console.log("Bye");

Выполнение этой программы происходит примерно так: вызов приветствия приводит к тому, что управление переходит к запуску этой функции (строка 2). Функция вызывает console.log , которая берет управление в свои руки, делает свою работу, а затем возвращает управление на строку 2. Там он доходит до конца функции greet, так что возвращается в место, которое вызвало его, то есть до четвертой строки. Линия после этого снова вызывает console.log. После этого программа доходит до конца.

Можно схематично показать поток управления следующим образом:

не в function
в greet
в console.log
в greet
не в function
в console.log
не в function

Поскольку при возвращении функция должна возвращаться в то место, откуда она была вызвана, компьютер должен помнить контекст, из которого произошел вызов. В одном случае, когда это будет сделано, файл console.log должен вернуться к функции great. В другом случае он возвращается в конец программы.

Местом, где компьютер хранит этот контекст, является стек вызовов. Каждый раз, когда вызывается функция, текущий контекст сохраняется в верхней части стека. Когда функция возвращается, она удаляет верхний контекст из стека и использует этот контекст для продолжения выполнения.

Хранение этого стека требует место в памяти компьютера. Когда стек становится слишком большим, компьютер выйдет из строя с сообщением на подобие: «недостаточно места в стеке» или «слишком много рекурсии».

Следующий код иллюстрирует это, задавая компьютеру действительно сложную задачу, которая вызывает бесконечное переключение между двумя функциями. Скорее это было бы бесконечно, если бы у компьютера был бесконечный стек.

function chicken() {
return egg();
}
function egg() {
return chicken();
}
console.log(chicken() + " came first.");
// → ??

Необязательные аргументы

Следующий код рабочий и выполняется без проблем:

function square(x) { return x * x; }
console.log(square(4, true, "hedgehog"));
// → 16

Мы определили квадрат только с одним параметром. Тем не менее, когда мы называем это тремя именами, программа не жалуется. Она игнорирует дополнительные аргументы и вычисляет квадрат первого аргумента "4".

JavaScript чрезвычайно разносторонен в отношении количества аргументов, которые вы передаете функции. Если вы укажете их слишком много, дополнительные будут игнорироваться. Если вы передадите слишком мало, отсутствующим параметрам будет присвоено значение undefined.

Недостатком этого является то, что возможно (даже вероятно), что вы случайно передадите неверное количество аргументов функциям. И никто не скажет вам об этом, будет просто вылезать ошибка.

Положительным моментом является то, что это поведение можно использовать для вызова функции с различным количеством аргументов. Например, эта функция minus пытается имитировать оператор -, воздействуя на один или два аргумента:

function minus(a, b) {
if (b === undefined) return -a;
else return a - b;
}
console.log(minus(10));
// → -10 console.log(minus(10, 5));
// → 5

Если после параметра указать оператор =, а затем выражение, значение этого выражения заменит аргумент, если он не задан.

Например, эта версия управления делает второй аргумент необязательным. Если вы не предоставите его или передадите значение undefined, по умолчанию оно будет равно 2, и функция будет вести себя как квадрат.

function power(base, exponent = 2) {
let result = 1;
for (let count = 0; count < exponent; count++) {
result *= base;
}
return result;
}
console.log(power(4));
// → 16 console.log(power(2, 6));
// → 64

Подписывайтесь на канал "Стать программистом"

Буду благодарен если кликните на лайк!