Skip to content

Commit d406053

Browse files
authored
Merge pull request #432 from javascript-tutorial/joaquinelio-frmt1-6-3-10s
fix format 1-6-3-10 sol
2 parents 3dd9041 + 2d6ec37 commit d406053

File tree

1 file changed

+51
-51
lines changed
  • 1-js/06-advanced-functions/03-closure/10-make-army

1 file changed

+51
-51
lines changed

1-js/06-advanced-functions/03-closure/10-make-army/solution.md

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -37,89 +37,89 @@ Examinemos lo que sucede dentro de `makeArmy`, y la solución será obvia.
3737

3838
Si miramos la fuente:
3939

40-
```js
41-
function makeArmy() {
42-
...
43-
let i = 0;
44-
while (i < 10) {
45-
let shooter = function() { // shooter function
40+
```js
41+
function makeArmy() {
42+
...
43+
let i = 0;
44+
while (i < 10) {
45+
let shooter = function() { // shooter function
4646
alert( i ); // debería mostrar su número
47-
};
47+
};
4848
shooters.push(shooter); // agrega la función al array
4949
i++;
50-
}
51-
...
52-
}
53-
```
50+
}
51+
...
52+
}
53+
```
5454

5555
Podemos ver que todas las funciones `shooter` están creadas en el ambiente léxico asociado a la ejecución de `makeArmy()`. Pero cuando se llama a `army[5]()`, `makeArmy` ya ha terminado su trabajo, y el valor final de `i` es `10` (`while` finaliza en `i=10`).
5656

5757
Como resultado, todas las funciones `shooter` obtienen el mismo valor del mismo entorno léxico externo, que es el último valor `i=10`.
5858

59-
![](lexenv-makearmy-empty.svg)
59+
![](lexenv-makearmy-empty.svg)
6060

6161
Como puedes ver arriba, con cada iteración del bloque `while {...}` un nuevo ambiente léxico es creado. Entonces, para corregir el problema podemos copiar el valor de `i` en una variable dentro del bloque `while {...}` como aquí:
6262

63-
```js run
64-
function makeArmy() {
65-
let shooters = [];
66-
67-
let i = 0;
68-
while (i < 10) {
69-
*!*
70-
let j = i;
71-
*/!*
72-
let shooter = function() { // shooter function
73-
alert( *!*j*/!* ); // debería mostrar su número
74-
};
75-
shooters.push(shooter);
76-
i++;
77-
}
63+
```js run
64+
function makeArmy() {
65+
let shooters = [];
66+
67+
let i = 0;
68+
while (i < 10) {
69+
*!*
70+
let j = i;
71+
*/!*
72+
let shooter = function() { // shooter function
73+
alert( *!*j*/!* ); // debería mostrar su número
74+
};
75+
shooters.push(shooter);
76+
i++;
77+
}
7878
79-
return shooters;
80-
}
79+
return shooters;
80+
}
8181
82-
let army = makeArmy();
82+
let army = makeArmy();
8383
8484
// Ahora el código funciona correctamente
85-
army[0](); // 0
86-
army[5](); // 5
87-
```
85+
army[0](); // 0
86+
army[5](); // 5
87+
```
8888

8989
Aquí `let j = i` declara una variable de iteración local `j` y copia `i` en ella. Las primitivas son copiadas por valor, así que realmente obtenemos una copia independiente de `i`, perteneciente a la iteración del bucle actual.
9090

9191
Los shooters funcionan correctamente, porque el valor de `i` ahora vive más cerca. No en el ambiente léxico de `makeArmy()` sino en el que corresponde a la iteración del bucle actual:
9292

93-
![](lexenv-makearmy-while-fixed.svg)
93+
![](lexenv-makearmy-while-fixed.svg)
9494

9595
Tal problema habría sido evitado si hubiéramos usado `for` desde el principio:
9696

97-
```js run demo
98-
function makeArmy() {
97+
```js run demo
98+
function makeArmy() {
9999
100-
let shooters = [];
100+
let shooters = [];
101101
102-
*!*
103-
for(let i = 0; i < 10; i++) {
104-
*/!*
105-
let shooter = function() { // shooter function
102+
*!*
103+
for(let i = 0; i < 10; i++) {
104+
*/!*
105+
let shooter = function() { // shooter function
106106
alert( i ); // debería mostrar su número
107-
};
108-
shooters.push(shooter);
109-
}
107+
};
108+
shooters.push(shooter);
109+
}
110110
111-
return shooters;
112-
}
111+
return shooters;
112+
}
113113
114-
let army = makeArmy();
114+
let army = makeArmy();
115115
116-
army[0](); // 0
117-
army[5](); // 5
118-
```
116+
army[0](); // 0
117+
army[5](); // 5
118+
```
119119

120120
Esto es esencialmente lo mismo, ya que cada iteración de `for` genera un nuevo ambiente léxico con su propia variable `i`. Así el `shooter` generado en cada iteración hace referencia a su propio `i`, de esa misma iteración.
121121

122-
![](lexenv-makearmy-for-fixed.svg)
122+
![](lexenv-makearmy-for-fixed.svg)
123123

124124
Ahora, como has puesto mucho esfuerzo leyendo esto, y la receta final es tan simple: simplemente usa `for`, puede que te preguntes: ¿valió la pena?
125125

0 commit comments

Comments
 (0)