blob: 40ab2f4c998e4ec50e260ab4747153a862f46f3d (
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
|
---
title: 호출 스택
slug: Glossary/Call_stack
tags:
- Glossary
- JavaScript
- 호출 스택
translation_of: Glossary/Call_stack
---
<p><strong>호출 스택</strong>은 여러 함수들({{glossary("function","functions")}})을 호출하는 스크립트에서 해당 위치를 추적하는 인터프리터 (웹 브라우저의 자바스크립트 인터프리터같은)를 위한 메커니즘입니다. 현재 어떤 함수가 동작하고있는 지, 그 함수 내에서 어떤 함수가 동작하는 지, 다음에 어떤 함수가 호출되어야하는 지 등을 제어합니다.</p>
<ul>
<li>스크립트가 함수를 호출하면 인터프리터는 이를 호출 스택에 추가한 다음 함수를 수행하기 시작합니다.</li>
<li>해당 함수에 의해 호출되는 모든 함수는 호출 스택에 추가되고 호출이 도달하는 위치에서 실행합니다.</li>
<li>메인 함수가 끝나면 인터프리터는 스택을 제거하고 메인 코드 목록에서 중단된 실행을 다시 시작합니다.</li>
<li>스택이 할당된 공간보다 많은 공간을 차지하면 "stack overflow" 에러가 발생합니다.</li>
</ul>
<h2 id="예제">예제</h2>
<pre class="brush: js line-numbers language-js"><code class="language-js"><span class="keyword token">function</span> <span class="function token">greeting</span><span class="punctuation token">(</span><span class="punctuation token">)</span> <span class="punctuation token">{</span>
<span class="comment token">// [1] Some codes here</span>
<span class="function token">sayHi</span><span class="punctuation token">(</span><span class="punctuation token">)</span><span class="punctuation token">;</span>
<span class="comment token">// [2] Some codes here</span>
<span class="punctuation token">}</span>
<span class="keyword token">function</span> <span class="function token">sayHi</span><span class="punctuation token">(</span><span class="punctuation token">)</span> <span class="punctuation token">{</span>
<span class="keyword token">return</span> <span class="string token">"Hi!"</span><span class="punctuation token">;</span>
<span class="punctuation token">}</span>
<span class="comment token">// Invoke the `greeting` function</span>
<span class="function token">greeting</span><span class="punctuation token">(</span><span class="punctuation token">)</span><span class="punctuation token">;</span>
<span class="comment token">// [3] Some codes here</span></code></pre>
<p>위 코드는 다음과 같이 실행될 것입니다.</p>
<ol>
<li><code>greeting()</code> 함수에 도달할 때까지, 모든 함수를 무시합니다.</li>
<li><code>greeting()</code> 함수를 호출합니다.</li>
<li><code>greeting()</code> 함수를 호출 스택 리스트에 추가합니다.<br>
<div class="note">
<p>호출 스택 리스트:<br>
- greeting</p>
</div>
</li>
<li>`greeting` 함수 내부의 모든 코드를 실행합니다.</li>
<li><code>sayHi()</code> 함수를 얻습니다.</li>
<li><code>sayHi()</code> 함수를 호출 스택 리스트에 추가합니다.<br>
<div class="note">
<p>호출 스택 리스트:<br>
- greeting<br>
- sayHi</p>
</div>
</li>
<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 코드의 나머지를 계속 실행합니다.</li>
<li>호출 스택 리스트에서 <code>greeting()</code> 함수를 제거합니다.<br>
<div class="note">
<p>호출 스택 리스트:<br>
EMPTY</p>
</div>
</li>
</ol>
<p>우리는 빈 호출 스택으로 시작하며, 함수를 호출할 때마다 자동으로 호출 스택에 추가되고, 해당 코드가 모두 실행된 후, 호출 스택에서 자동으로 제거됩니다. 결국, 마찬가지로 빈 호출 스택으로 끝납니다.</p>
<h2 id="더_알아보기">더 알아보기</h2>
<h3 id="일반_지식">일반 지식</h3>
<ul>
<li>{{Interwiki("wikipedia", "Call stack")}} on Wikipedia</li>
</ul>
|