--- title: Call stack slug: Glossary/Call_stack tags: - Glossary translation_of: Glossary/Call_stack original_slug: Словарь/Call_stack --- <p><strong>Стек вызовов(call stack) </strong>- это механизм для интерпретаторов (таких как интерпретатор JavaScript в веб-браузере) для отслеживания текущего местонахождения интерпретатора в скрипте, который вызывает несколько функций типа {{glossary("function","functions")}}, — какая из функций выполняется на данный момент, какие функции вызываются изнутри этой (выполняемой) функции, какая будет вызвана следующей и т. д.</p> <ul> <li>Когда скрипт вызывает функцию, интерпретатор добавляет ее в стек вызовов и потом начинает ее обработку.</li> <li>Любые функции, вызванные этой функцией, добавляются в стек вызовов и выполняются, как только происходит их вызов. </li> <li>Когда выполнение основной функции завершено, интерпретатор снимает ее со стека вызовов и возобновляет выполнение кода в списке основного кода с той точки, где остановился до этого.</li> <li>Если стек занимает больше места, чем ему было присвоено, это приводит к ошибке переполнения стека ("stack overflow" error).</li> </ul> <h2 id="Пример">Пример</h2> <p> </p> <pre class="brush: js">function greeting() { // [1] Some codes here sayHi(); // [2] Some codes here } function sayHi() { return "Hi!"; } // Invoke the `greeting` function greeting(); // [3] Some codes here</pre> <p>Код выше будет выполнен следующим образом:</p> <ol> <li>Игнорирование всех функций, пока не будет достигнуто место вызова функции <code>greeting()</code>.</li> <li>Вызывается функция <code>greeting().</code></li> <li>Функция "greeting" помещается в очередь стека вызовов.</li> </ol> <div class="note"> <p>Очередь стека вызовов:<br> - greeting</p> </div> <p> </p> <ol start="4"> <li>Выполняется код внутри функции `greeting`.</li> <li>Вызывается функция <code>sayHi()</code>.</li> <li>Функция <code>sayHi()</code> помещается в очередь стека вызовов.</li> </ol> <div class="note"> <p>Очередь стека вызовов:<br> - greeting<br> - sayHi</p> </div> <ol start="7"> <li>Выполняется весь код внутри функции <code>sayHi()</code> до самого конца.</li> <li>Возврат выполнения кода с места вызова функции <code>sayHi()</code> и продолжение выполнения оставшегося кода функции <code>greeting()</code>.</li> <li>Выполненная функция <code>sayHi()</code> удаляется из очереди стека вызовов.<br> <div class="note"> <p>Очередь стека вызовов:<br> - greeting</p> </div> </li> <li>Когда весь код внутри функции <code>greeting()</code> выполнен, происходит возврат выполнения оставшейся части основного скрипта JS с места вызова функции <code>greeting()</code>.</li> <li>Выполненная функция <code>greeting()</code> удаляется из очереди стека вызовов.<br> <div class="note"> <p>Очередь стека вызовов:<br> ПУСТО</p> </div> </li> </ol> <p>Выполнение кода началось с пустого стека вызовов, и всякий раз, когда мы вызывали функцию, она автоматически добавлялась в очередь стека вызовов, после выполнения всего своего кода она автоматически удалялась из очереди стека вызовов. И в конце выполнение кода также завершилось с пустым стеком вызовов.</p> <h2 id="Узнать_больше">Узнать больше</h2> <h3 id="Общие_знания">Общие знания</h3> <ul> <li>{{Interwiki("wikipedia", "Call stack")}} на Википедии</li> </ul> <section id="Quick_Links"> <ul> <li><a href="/ru/docs/Glossary">MDN Web Docs Glossary</a> <ul> <li>{{Glossary("Call stack")}}</li> <li>{{Glossary("Function")}}</li> </ul> </li> </ul> </section>