aboutsummaryrefslogtreecommitdiff
path: root/files/ru/glossary/call_stack/index.html
blob: 21f77b6330cbccd830c549b73ecf9b635a6a4a98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
---
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>