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
|
---
title: Pila de llamadas
slug: Glossary/Call_stack
tags:
- Glosario
- JavaScript
- Pila de llamadas
translation_of: Glossary/Call_stack
original_slug: Glossary/Pila_llamadas
---
<p>Una <strong>pila de llamadas</strong> es un mecanismo para que un intérprete (como el intérprete de JavaScript en un navegador web) realice un seguimiento de en que lugar se llama a múltiples {{glossary("function","funciones")}}, qué función se esta ejecutando actualmente y qué funciones son llamadas desde esa función, etc.</p>
<ul>
<li>Cuando un script llama a una función, el intérprete la añade a la pila de llamadas y luego empieza a ejecutar la función.</li>
<li>Cualquier función o funciones que sean llamadas por esa función son añadidas arriba de la pila de llamadas y serán ejecutadas cuando su llamada sea alcanzada.</li>
<li>Cuando la función actual termina, el intérprete la elimina de la pila y reanuda la ejecución donde se quedó.</li>
<li>Si la pila necesita más espacio del que se le asignó, se producirá un error de "desbordamiento de pila".</li>
</ul>
<h2 id="Ejemplo">Ejemplo</h2>
<pre class="brush: js">function saludar() {
// [1] Código
diHola();
// [2] Código
}
function diHola() {
return "!Hola!";
}
// Invocar la función `saludar`
saludar();
// [3] Código
</pre>
<p>El código del ejemplo se ejecutaría de la siguiente manera:</p>
<ol>
<li>Ignora todas las funciones hasta que alcanza la invocación de la función <code>saludar()</code>.</li>
<li>Añade la función <code>saludar()</code> a la lista de la pila de llamadas.
<div class="note">
<p>Lista de la pila de llamadas:<br>
- saludar</p>
</div>
</li>
<li>Ejecuta todas las líneas de código de dentro de la función <code>saludar()</code>.</li>
<li>Llega a la incovación de la función <code>diHola()</code>.</li>
<li>Añade la función <code>diHola()</code> a la lista de la pila de llamadas.
<div class="note">
<p>Lista de la pila de llamadas:<br>
- saludar<br>
- diHola</p>
</div>
</li>
<li>Ejecuta todas las líneas de código de dentro de la función <code>diHola()</code> hasta que llega al final.</li>
<li>Devuelve la ejecución a la línea que invocó a la función <code>diHola()</code> y continua con la ejecuación del resto de código de la función <code>saludar()</code>.</li>
<li>Elimina la función <code>diHola()</code> de la lista de la pila de llamadas.
<div class="note">
<p>Lista de la pila de llamadas:<br>
- saludar</p>
</div>
</li>
<li>Cuando todo el código dentro de la función <code>saludar()</code> ha sido ejecutado, vuelve a la línea que la invocó y continua ejecutando el resto de código JavaScript.</li>
<li>Elimina la función <code>saludar()</code> de la lista de la pila de llamadas.
<div class="note">
<p>Lista de la pila de llamadas:<br>
VACÍA</p>
</div>
</li>
</ol>
<p>En resumen, empezamos con una lista de la pila llamadas vacía. Cuando invocamos una función, ésta es automáticamente añadida a la pila de llamadas. Una vez ha ejecutado todo su código, también de manera automática es eliminada de la pila de llamadas. Finalmente, la pila de llamadas vuelve a estar vacía.</p>
<h2 id="Saber_más">Saber más</h2>
<h3 id="Conocimiento_general">Conocimiento general</h3>
<ul>
<li>{{Interwiki("wikipedia", "Pila de llamadas")}} en Wikipedia</li>
</ul>
<section class="Quick_links" id="Quick_Links">
<ul>
<li><a href="/es-ES/docs/Glossary">Glosario</a>
<ul>
<li>{{Glossary("Call stack", "Pila de llamadas")}}</li>
<li>{{Glossary("function", "Función")}}</li>
</ul>
</li>
</ul>
</section>
|