1
00:00:01,480 --> 00:00:03,620
Hay una característica casi mística

2
00:00:03,620 --> 00:00:05,390
de funciones de script Java

3
00:00:05,390 --> 00:00:09,438
que muchos desarrolladores no logran comprender por completo.

4
00:00:09,438 --> 00:00:13,572
Y de lo que estoy hablando es de algo llamado cierres.

5
00:00:13,572 --> 00:00:15,440
Así que cuando les pregunté a mis alumnos,

6
00:00:15,440 --> 00:00:18,753
¿Cuál es el concepto de JavaScript más difícil de entender?

7
00:00:18,753 --> 00:00:22,290
entonces mucha gente dice que son cierres.

8
00:00:22,290 --> 00:00:25,400
Sin embargo, creo que con la explicación correcta,

9
00:00:25,400 --> 00:00:27,830
en realidad no es tan dificil

10
00:00:27,830 --> 00:00:30,740
especialmente cuando ya entendiste todo

11
00:00:30,740 --> 00:00:33,020
que aprendiste antes en este curso,

12
00:00:33,020 --> 00:00:35,120
como el contexto de ejecución,

13
00:00:35,120 --> 00:00:37,800
la pila de llamadas y la cadena de escultura,

14
00:00:37,800 --> 00:00:40,810
porque los cierres traen todos estos conceptos

15
00:00:40,810 --> 00:00:45,370
juntos de una manera hermosa, casi mágica.

16
00:00:45,370 --> 00:00:49,463
Así que basta de charla, veamos de qué se tratan los cierres.

17
00:00:51,400 --> 00:00:54,561
Así que voy a empezar creando una nueva función aquí.

18
00:00:54,561 --> 00:00:57,853
llamada reserva segura.

19
00:01:00,450 --> 00:01:04,810
Y es esta función la que creará el cierre.

20
00:01:04,810 --> 00:01:08,036
Ahora, lo primero que necesito decirles sobre los cierres

21
00:01:08,036 --> 00:01:13,036
es que un cierre no es una característica que usamos explícitamente.

22
00:01:13,710 --> 00:01:16,292
Entonces no creamos cierres manualmente,

23
00:01:16,292 --> 00:01:20,310
como si creamos una nueva matriz o una nueva función.

24
00:01:20,310 --> 00:01:22,741
Entonces, un cierre simplemente ocurre automáticamente.

25
00:01:22,741 --> 00:01:25,540
en ciertas situaciones, solo necesitamos

26
00:01:25,540 --> 00:01:28,310
para reconocer esas situaciones.

27
00:01:28,310 --> 00:01:31,600
Y eso es lo que vamos a hacer aquí en este ejemplo.

28
00:01:31,600 --> 00:01:33,908
Así que vamos a crear una de esas situaciones.

29
00:01:33,908 --> 00:01:37,773
para que luego podamos echar un vistazo a un cierre.

30
00:01:38,730 --> 00:01:41,430
De todos modos, ahora continuemos escribiendo este ejemplo.

31
00:01:43,730 --> 00:01:45,110
y estoy llamando a este un pasajeroContar

32
00:01:46,530 --> 00:01:49,410
y empezará de cero, pero estaremos

33
00:01:49,410 --> 00:01:51,720
capaz de manipularlo.

34
00:01:51,720 --> 00:01:53,240
Y estoy llamando a esta función aquí,

35
00:01:53,240 --> 00:01:55,947
reserva segura porque esta variable de número de pasajeros

36
00:01:55,947 --> 00:02:00,947
no puede ser manipulado y accedido desde el exterior.

37
00:02:02,690 --> 00:02:05,360
Entonces, y ahora, ¿qué tiene de especial esta función?

38
00:02:05,360 --> 00:02:09,163
es que devolverá una nueva función.

39
00:02:12,600 --> 00:02:15,773
Y lo que hacemos en esta función es actualizar

40
00:02:15,773 --> 00:02:18,303
la variable número de pasajeros.

41
00:02:19,220 --> 00:02:22,803
Entonces, la variable que se define en la función principal.

42
00:02:23,800 --> 00:02:25,670
Eso es importante.

43
00:02:25,670 --> 00:02:28,810
Y luego registremos el nuevo número de pasajeros

44
00:02:28,810 --> 00:02:29,943
a la consola

45
00:02:32,800 --> 00:02:37,480
Así que pasajeroConde, está bien,

46
00:02:37,480 --> 00:02:41,130
y ahora llamemos a la función de reserva segura

47
00:02:41,130 --> 00:02:44,333
y luego almacenar el resultado en una variable llamada Booker.

48
00:02:46,820 --> 00:02:49,100
Y esto es bastante similar a lo que hicimos

49
00:02:49,100 --> 00:02:52,600
previamente en la lección de funciones

50
00:02:52,600 --> 00:02:54,490
devolviendo otras funciones.

51
00:02:54,490 --> 00:02:56,752
Así que tenemos una función aquí que llamamos

52
00:02:56,752 --> 00:03:00,970
y esta función devolverá esta nueva función.

53
00:03:00,970 --> 00:03:02,669
Y así como llamamos reserva segura,

54
00:03:02,669 --> 00:03:05,700
devolverá exactamente esta función

55
00:03:05,700 --> 00:03:09,090
y luego se almacenará dentro de este Booker.

56
00:03:09,090 --> 00:03:12,673
Y entonces, esto de aquí ahora también será una función, ¿verdad?

57
00:03:13,660 --> 00:03:15,290
Así que analicemos en detalle

58
00:03:15,290 --> 00:03:17,660
qué sucede cuando esta línea de código aquí

59
00:03:17,660 --> 00:03:20,180
se ejecuta usando todos los conceptos

60
00:03:20,180 --> 00:03:21,633
que ya conocemos.

61
00:03:23,130 --> 00:03:26,700
Este es exactamente el código que acabamos de escribir.

62
00:03:26,700 --> 00:03:28,410
Ahora, antes de empezar a correr

63
00:03:28,410 --> 00:03:30,760
la función de reserva segura aquí abajo,

64
00:03:30,760 --> 00:03:34,720
nuestro código se ejecuta en el contexto de ejecución global.

65
00:03:34,720 --> 00:03:36,970
Y allí, actualmente solo tenemos

66
00:03:36,970 --> 00:03:39,180
esta función de reserva segura.

67
00:03:39,180 --> 00:03:42,260
Y entonces también podemos decir que el alcance global

68
00:03:42,260 --> 00:03:44,970
ahora contiene reserva segura.

69
00:03:44,970 --> 00:03:48,530
Luego, cuando se ejecuta la reserva segura,

70
00:03:48,530 --> 00:03:50,718
se pone un nuevo contexto de ejecución

71
00:03:50,718 --> 00:03:53,820
en la parte superior de la pila de ejecución.

72
00:03:53,820 --> 00:03:56,233
Ahora, recuerda, cada contexto de ejecución

73
00:03:56,233 --> 00:03:58,730
tiene un entorno variable,

74
00:03:58,730 --> 00:04:01,900
que contiene todas sus variables locales.

75
00:04:01,900 --> 00:04:04,831
En este caso, solo contiene el número de pasajeros.

76
00:04:04,831 --> 00:04:06,363
puesto a cero.

77
00:04:07,200 --> 00:04:09,120
Este entorno variable también es

78
00:04:09,120 --> 00:04:11,470
el alcance de esta función.

79
00:04:11,470 --> 00:04:14,441
Y así la cadena de alcance de este contexto de ejecución

80
00:04:14,441 --> 00:04:16,191
Se ve como esto.

81
00:04:16,191 --> 00:04:19,315
Así que PassengerCount está en el ámbito local,

82
00:04:19,315 --> 00:04:22,480
pero, por supuesto, este alcance también tiene acceso

83
00:04:22,480 --> 00:04:25,540
a todas las variables de los ámbitos de los padres.

84
00:04:25,540 --> 00:04:28,960
Y en este caso, solo un alcance global.

85
00:04:28,960 --> 00:04:32,161
De todos modos, en la siguiente línea de la función de reserva segura,

86
00:04:32,161 --> 00:04:36,060
se devuelve una nueva función y se almacenará

87
00:04:36,060 --> 00:04:37,960
en la variable Booker.

88
00:04:37,960 --> 00:04:42,710
Entonces, el contexto global ahora también contiene la variable Booker.

89
00:04:42,710 --> 00:04:44,710
Y ahora que mas pasa cuando

90
00:04:44,710 --> 00:04:47,600
vuelve la función de reserva segura?

91
00:04:47,600 --> 00:04:48,990
Bueno, eso es correcto.

92
00:04:48,990 --> 00:04:53,268
Su contexto de ejecución salta de la pila y desaparece.

93
00:04:53,268 --> 00:04:56,740
Así que la función de reserva segura ha hecho su trabajo

94
00:04:56,740 --> 00:04:59,700
y ahora ha terminado la ejecución.

95
00:04:59,700 --> 00:05:03,980
Realmente se ha ido ahora y eso es importante tenerlo en cuenta.

96
00:05:03,980 --> 00:05:05,770
y para tener en cuenta.

97
00:05:05,770 --> 00:05:08,860
Y por ahora, eso es todo lo que hicimos.

98
00:05:08,860 --> 00:05:11,914
Así que todo esto no es nada nuevo a estas alturas, ¿verdad?

99
00:05:11,914 --> 00:05:14,530
Todo lo que hicimos fue analizar la pila de llamadas

100
00:05:14,530 --> 00:05:18,620
y la cadena de alcance como llamamos a la función de reserva segura.

101
00:05:18,620 --> 00:05:20,870
Y esto va a ser importante para más adelante

102
00:05:20,870 --> 00:05:22,950
entender el cierre.

103
00:05:22,950 --> 00:05:26,320
Entonces, hasta el momento, no vimos el cierre todavía.

104
00:05:26,320 --> 00:05:29,357
Todo lo que hicimos fue usar el conocimiento que ya tenemos

105
00:05:29,357 --> 00:05:33,600
para entender cómo se creó esta función de Booker,

106
00:05:33,600 --> 00:05:37,610
porque eso va a ser importante para el próximo paso.

107
00:05:37,610 --> 00:05:39,357
Así que ahora volvamos a nuestro código.

108
00:05:39,357 --> 00:05:42,400
para usar realmente la función Booker,

109
00:05:42,400 --> 00:05:45,313
y finalmente ver el cierre en acción.

110
00:05:46,950 --> 00:05:49,880
Ahora que entendemos cómo funciona Booker

111
00:05:49,880 --> 00:05:53,003
fue creado, llamémoslo ahora realmente aquí.

112
00:05:54,860 --> 00:05:58,790
Así que llamándolo un par de veces aquí, y como podemos ver,

113
00:05:58,790 --> 00:06:00,930
no necesita ningún argumento.

114
00:06:00,930 --> 00:06:03,613
No hay una lista de parámetros, ¿verdad?

115
00:06:05,150 --> 00:06:07,080
Así que llamémoslo aquí tres veces

116
00:06:09,280 --> 00:06:13,120
y ahora vamos a recargar la página aquí.

117
00:06:13,120 --> 00:06:17,670
Y de hecho tenemos uno, dos, tres pasajeros.

118
00:06:17,670 --> 00:06:20,682
Entonces, lo que esto significa es que la función de Booker

119
00:06:20,682 --> 00:06:24,910
de hecho fue capaz de incrementar el número de pasajeros

120
00:06:24,910 --> 00:06:28,810
a uno, luego a dos y luego a tres.

121
00:06:28,810 --> 00:06:30,920
Pero ahora si pensamos en esto,

122
00:06:30,920 --> 00:06:33,300
entonces, ¿cómo es esto posible?

123
00:06:33,300 --> 00:06:35,143
¿Cómo se puede actualizar la función Booker?

124
00:06:35,143 --> 00:06:38,196
esta variable de número de pasajeros que está definida

125
00:06:38,196 --> 00:06:40,200
en una función de reserva segura

126
00:06:40,200 --> 00:06:44,030
que en realidad ya ha terminado de ejecutarse.

127
00:06:44,030 --> 00:06:45,670
Y así, como acabo de decir,

128
00:06:45,670 --> 00:06:48,970
esta función ya ha terminado su ejecución.

129
00:06:48,970 --> 00:06:50,090
Se fue.

130
00:06:50,090 --> 00:06:53,980
Entonces su contexto de ejecución ya no está en la pila,

131
00:06:53,980 --> 00:06:56,290
como acabamos de ver en la diapositiva,

132
00:06:56,290 --> 00:06:59,030
pero aún esta función interna aquí,

133
00:06:59,030 --> 00:07:01,180
que es la función de Booker,

134
00:07:01,180 --> 00:07:04,911
todavía puede acceder a la variable PassengerCount

135
00:07:04,911 --> 00:07:07,700
eso está dentro de la función Booker

136
00:07:07,700 --> 00:07:10,380
que ya no debería existir.

137
00:07:10,380 --> 00:07:13,708
Y tal vez puedas adivinar que lo que hace esto posible

138
00:07:13,708 --> 00:07:17,120
es un cierre, pero antes explico

139
00:07:17,120 --> 00:07:19,400
exactamente cómo funciona el cierre,

140
00:07:19,400 --> 00:07:21,760
Quiero que aprecies una vez más,

141
00:07:21,760 --> 00:07:24,870
qué extraño es esto en realidad.

142
00:07:24,870 --> 00:07:27,529
De nuevo, esta función de Booker aquí

143
00:07:27,529 --> 00:07:30,150
es simplemente una función que existe

144
00:07:30,150 --> 00:07:32,193
aquí en el entorno global

145
00:07:32,193 --> 00:07:35,200
o en el ámbito global, ¿verdad?

146
00:07:35,200 --> 00:07:38,383
Y el entorno en el que se creó la función.

147
00:07:38,383 --> 00:07:41,870
Así que este año básicamente, este ambiente

148
00:07:41,870 --> 00:07:44,150
ya no está activo.

149
00:07:44,150 --> 00:07:46,080
De hecho, se ha ido.

150
00:07:46,080 --> 00:07:49,110
Pero aún así la función de Booker continúa de alguna manera.

151
00:07:49,110 --> 00:07:50,980
tener acceso a las variables

152
00:07:50,980 --> 00:07:55,300
que estaban presentes en el momento en que se creó la función.

153
00:07:55,300 --> 00:07:59,300
Y en particular, esta variable de número de pasajeros aquí.

154
00:07:59,300 --> 00:08:02,237
Y eso es exactamente lo que hace el cierre.

155
00:08:02,237 --> 00:08:05,520
Entonces podemos decir que un cierre hace una función

156
00:08:05,520 --> 00:08:08,466
recordar todas las variables que existieron

157
00:08:08,466 --> 00:08:12,490
esencialmente en el lugar de nacimiento de la función, ¿verdad?

158
00:08:12,490 --> 00:08:15,960
Entonces podemos imaginar la reserva segura

159
00:08:15,960 --> 00:08:19,510
por ser el lugar de nacimiento de esta función.

160
00:08:19,510 --> 00:08:22,070
Así que de la función de Booker, esencialmente.

161
00:08:22,070 --> 00:08:25,829
Y así esta función recuerda todo en su lugar de nacimiento,

162
00:08:25,829 --> 00:08:28,540
en el momento de su creación.

163
00:08:28,540 --> 00:08:31,000
Y esto no se puede explicar simplemente

164
00:08:31,000 --> 00:08:33,160
solo con la cadena de alcance.

165
00:08:33,160 --> 00:08:35,769
Así que también tenemos que entender el cierre.

166
00:08:35,769 --> 00:08:39,743
Y permítanme ahora, realmente explicar cómo funciona realmente.

167
00:08:40,940 --> 00:08:43,550
Así es como dejamos la pila de llamadas

168
00:08:43,550 --> 00:08:46,820
y la cadena de escultura después de la última diapositiva.

169
00:08:46,820 --> 00:08:49,310
Y lo más importante a notar aquí

170
00:08:49,310 --> 00:08:52,322
es que el contexto de ejecución de la reserva segura

171
00:08:52,322 --> 00:08:55,140
ya no está en la pila de llamadas,

172
00:08:55,140 --> 00:08:58,210
porque de nuevo, esta función ha terminado

173
00:08:58,210 --> 00:09:00,600
ejecución hace mucho tiempo.

174
00:09:00,600 --> 00:09:04,129
Así que ahora es el momento de ejecutar finalmente la función Booker.

175
00:09:04,129 --> 00:09:07,520
y ver exactamente lo que va a pasar aquí.

176
00:09:07,520 --> 00:09:11,540
Y tenga en cuenta que Booker es realmente esta función aquí,

177
00:09:11,540 --> 00:09:13,583
ubicado en el ámbito global.

178
00:09:14,540 --> 00:09:17,016
De todos modos, lo primero que va a pasar

179
00:09:17,016 --> 00:09:20,382
es que se crea un nuevo contexto de ejecución

180
00:09:20,382 --> 00:09:23,410
y poner en la parte superior de la pila de llamadas

181
00:09:23,410 --> 00:09:27,036
y el entorno variable de este contexto se vacía

182
00:09:27,036 --> 00:09:29,480
simplemente porque no hay variables

183
00:09:29,480 --> 00:09:31,990
declarado en esta función.

184
00:09:31,990 --> 00:09:34,680
Ahora, ¿qué pasa con la cadena de alcance?

185
00:09:34,680 --> 00:09:37,539
Bueno, dado que Booker está en el contexto global,

186
00:09:37,539 --> 00:09:41,270
es simplemente el alcance de un niño del alcance global,

187
00:09:41,270 --> 00:09:44,480
así, pero tal vez ahora

188
00:09:44,480 --> 00:09:46,870
Estás empezando a ver el problema.

189
00:09:46,870 --> 00:09:49,509
Entonces, ¿cómo accederá la función Booker

190
00:09:49,509 --> 00:09:52,510
la variable conteo de pasajeros?

191
00:09:52,510 --> 00:09:56,460
No se encuentra en ninguna parte de la cadena de alcance, ¿verdad?

192
00:09:56,460 --> 00:09:58,580
Así que aquí es donde empezamos a revelar

193
00:09:58,580 --> 00:10:01,330
el secreto del cierre

194
00:10:01,330 --> 00:10:04,100
y el secreto es básicamente este.

195
00:10:04,100 --> 00:10:07,541
Cualquier función siempre tiene acceso al entorno variable.

196
00:10:07,541 --> 00:10:12,183
del contexto de ejecución en el que se creó la función.

197
00:10:13,040 --> 00:10:16,719
Ahora, en el caso de Booker, se creó esta función.

198
00:10:16,719 --> 00:10:21,719
Nació en el contexto de ejecución de la reserva segura,

199
00:10:22,060 --> 00:10:26,360
que se sacó de la pila anteriormente, ¿recuerdas?

200
00:10:26,360 --> 00:10:28,920
Entonces, por lo tanto, la función de Booker

201
00:10:28,920 --> 00:10:32,470
tendrá acceso a este entorno variable,

202
00:10:32,470 --> 00:10:35,623
que contiene la variable PassengerCount.

203
00:10:35,623 --> 00:10:39,170
Y así es como la función podrá leer

204
00:10:39,170 --> 00:10:42,840
y manipule la variable PassengerCount.

205
00:10:42,840 --> 00:10:46,273
Y entonces es esta conexión la que llamamos cierre.

206
00:10:47,690 --> 00:10:51,700
Así que digamos todo eso de nuevo, para dejar esto realmente claro.

207
00:10:51,700 --> 00:10:55,658
Entonces una función siempre tiene acceso al entorno variable.

208
00:10:55,658 --> 00:10:59,980
del contexto de ejecución en el que fue creado,

209
00:10:59,980 --> 00:11:03,920
incluso después de que se haya ido un contexto de ejecución de deuda.

210
00:11:03,920 --> 00:11:06,800
Y esta última parte es realmente importante.

211
00:11:06,800 --> 00:11:10,400
El cierre es entonces básicamente este entorno variable.

212
00:11:10,400 --> 00:11:12,500
adjunto a la función,

213
00:11:12,500 --> 00:11:15,530
exactamente como era en el momento y lugar

214
00:11:15,530 --> 00:11:18,110
que la función fue creada.

215
00:11:18,110 --> 00:11:22,290
Y esto probablemente todavía suene confuso, pero no te preocupes.

216
00:11:22,290 --> 00:11:26,025
Tengo algunas analogías más familiares en la siguiente diapositiva.

217
00:11:26,025 --> 00:11:29,397
Por ahora, solo estamos tratando de entender el mecanismo.

218
00:11:29,397 --> 00:11:33,525
detrás del cierre, cómo funciona todo detrás de escena.

219
00:11:33,525 --> 00:11:37,610
Entonces, lo que más importa aquí es que la función Booker

220
00:11:37,610 --> 00:11:40,472
tiene acceso a la variable PassengerCount

221
00:11:40,472 --> 00:11:43,435
porque está básicamente definido en el ámbito

222
00:11:43,435 --> 00:11:47,141
en el que se creó realmente la función Booker.

223
00:11:47,141 --> 00:11:51,068
Entonces, en cierto sentido, la cadena de alcance en realidad se conserva

224
00:11:51,068 --> 00:11:54,210
a través del cierre, incluso cuando un alcance

225
00:11:54,210 --> 00:11:56,260
ya ha sido destruido

226
00:11:56,260 --> 00:11:59,384
porque su contexto de ejecución se ha ido.

227
00:11:59,384 --> 00:12:03,080
Esto significa que aunque el contexto de ejecución

228
00:12:03,080 --> 00:12:04,742
en realidad ha sido destruido,

229
00:12:04,742 --> 00:12:07,659
el entorno variable de alguna manera sigue viviendo

230
00:12:07,659 --> 00:12:10,210
en algún lugar del motor.

231
00:12:10,210 --> 00:12:13,820
Ahora podemos decir que la función de Booker cerró

232
00:12:13,820 --> 00:12:18,272
su ámbito principal o sobre su entorno variable principal.

233
00:12:18,272 --> 00:12:21,080
Y esto incluye todos los argumentos de función.

234
00:12:21,080 --> 00:12:24,650
Aunque en este ejemplo, no tenemos ninguno.

235
00:12:24,650 --> 00:12:28,656
Y ahora esta adjunto o cerrado sobre entorno variable

236
00:12:28,656 --> 00:12:31,920
se queda con la función para siempre.

237
00:12:31,920 --> 00:12:36,350
Lo llevará consigo y podrá usarlo para siempre.

238
00:12:36,350 --> 00:12:38,750
Para hacerlo un poco más digerible,

239
00:12:38,750 --> 00:12:41,435
también podemos decir que gracias al cierre,

240
00:12:41,435 --> 00:12:45,015
una función no pierde la conexión con las variables

241
00:12:45,015 --> 00:12:48,120
que existía en el lugar de nacimiento de la función.

242
00:12:48,120 --> 00:12:50,619
Eso es un poco más intuitivo, ¿verdad?

243
00:12:50,619 --> 00:12:53,520
Pero de todos modos, vamos a ver qué pasa ahora

244
00:12:53,520 --> 00:12:56,890
con la ejecución de la función Booker.

245
00:12:56,890 --> 00:12:59,490
Entonces la función intenta aumentar

246
00:12:59,490 --> 00:13:01,830
la variable número de pasajeros.

247
00:13:01,830 --> 00:13:05,980
Sin embargo, esta variable no está en el alcance actual.

248
00:13:05,980 --> 00:13:09,454
Y entonces JavaScript buscará inmediatamente en el cierre.

249
00:13:09,454 --> 00:13:12,830
y ver si puede encontrar la variable allí.

250
00:13:12,830 --> 00:13:16,677
Y lo hace incluso antes de mirar la cadena de alcance.

251
00:13:16,677 --> 00:13:20,570
Por ejemplo, si hubiera una variable global de número de pasajeros

252
00:13:20,570 --> 00:13:25,016
establecido en 10, todavía usaría primero el que está en el cierre.

253
00:13:25,016 --> 00:13:30,000
Entonces, el cierre básicamente tiene prioridad sobre la cadena de alcance.

254
00:13:30,000 --> 00:13:31,970
Y así, después de ejecutar esta función,

255
00:13:31,970 --> 00:13:34,190
el número de pasajeros se convierte en uno.

256
00:13:34,190 --> 00:13:35,940
Este mensaje está registrado.

257
00:13:35,940 --> 00:13:40,350
Y luego el contexto de ejecución se saca de la pila.

258
00:13:40,350 --> 00:13:42,990
Luego, la ejecución pasa a la siguiente línea.

259
00:13:42,990 --> 00:13:46,990
Obtenemos un nuevo contexto de ejecución y un cierre todavía está allí,

260
00:13:46,990 --> 00:13:51,790
todavía adjunto a la función y el valor sigue siendo uno.

261
00:13:51,790 --> 00:13:53,849
Y ahora esta función se ejecuta,

262
00:13:53,849 --> 00:13:56,546
aumentando la cuenta de pasajeros hasta dos

263
00:13:56,546 --> 00:13:59,790
y registrar un mensaje de nuevo.

264
00:13:59,790 --> 00:14:02,670
Bien, y eso es lo que son los cierres.

265
00:14:02,670 --> 00:14:04,942
y cómo trabajan detrás de escena.

266
00:14:04,942 --> 00:14:08,720
Y sé que todo esto es bastante complejo.

267
00:14:08,720 --> 00:14:11,420
Así que déjame darte un par de definiciones diferentes

268
00:14:11,420 --> 00:14:14,313
de cierre ahora, algunos más formales

269
00:14:14,313 --> 00:14:19,080
y algunos más intuitivos y quizás más fáciles de entender.

270
00:14:19,080 --> 00:14:21,750
Y la definición más formal de cierre

271
00:14:21,750 --> 00:14:23,690
es el que ya vimos,

272
00:14:23,690 --> 00:14:27,320
que es que un cierre es la variable cerrada

273
00:14:27,320 --> 00:14:30,060
entorno del contexto de ejecución

274
00:14:30,060 --> 00:14:32,385
en el que se creó una función

275
00:14:32,385 --> 00:14:36,700
incluso después de que ese contexto de ejecución haya desaparecido,

276
00:14:36,700 --> 00:14:39,610
o en otras palabras, incluso después de la función

277
00:14:39,610 --> 00:14:43,563
al que pertenece el contexto de ejecución ha regresado.

278
00:14:44,500 --> 00:14:47,138
A continuación y un poco más fácil de entender,

279
00:14:47,138 --> 00:14:51,400
un cierre le da a una función acceso a todas las variables

280
00:14:51,400 --> 00:14:53,340
de su función madre.

281
00:14:53,340 --> 00:14:56,860
Entonces la función en la que está definida

282
00:14:56,860 --> 00:15:00,900
incluso después de que esa función principal haya regresado.

283
00:15:00,900 --> 00:15:04,224
Entonces la función mantiene una referencia a su ámbito externo.

284
00:15:04,224 --> 00:15:07,530
incluso después de que ese alcance externo se haya ido,

285
00:15:07,530 --> 00:15:11,193
que básicamente preserva la cadena de alcance a lo largo del tiempo.

286
00:15:12,200 --> 00:15:14,230
Muy bien, otra definición,

287
00:15:14,230 --> 00:15:18,500
o digamos analogía es que un cierre se asegura

288
00:15:18,500 --> 00:15:21,320
que una función nunca pierde la conexión

289
00:15:21,320 --> 00:15:25,310
a las variables que existían en el lugar de nacimiento de la función.

290
00:15:25,310 --> 00:15:27,070
Recuerda las variables,

291
00:15:27,070 --> 00:15:30,200
incluso después de que el lugar de nacimiento se ha ido.

292
00:15:30,200 --> 00:15:32,900
Es como una persona que no pierde la conexión.

293
00:15:32,900 --> 00:15:35,030
a su ciudad natal.

294
00:15:35,030 --> 00:15:38,233
En esta analogía, la persona es la función

295
00:15:38,233 --> 00:15:42,040
y la ciudad natal es el alcance de los padres de la función,

296
00:15:42,040 --> 00:15:44,520
y la función entonces no pierde la conexión

297
00:15:44,520 --> 00:15:48,400
a las variables almacenadas en el alcance de este padre.

298
00:15:48,400 --> 00:15:51,013
Y espero que eso tenga sentido.

299
00:15:51,870 --> 00:15:54,236
Finalmente, a algunas personas les gusta pensar en

300
00:15:54,236 --> 00:15:58,540
este adjunto entorno variable como una mochila.

301
00:15:58,540 --> 00:16:02,130
Entonces, en esta analogía, una función tiene una mochila,

302
00:16:02,130 --> 00:16:05,470
que lleva por donde quiera que va.

303
00:16:05,470 --> 00:16:08,250
Y esta mochila contiene todas las variables

304
00:16:08,250 --> 00:16:10,670
que estaban presentes en el ambiente

305
00:16:10,670 --> 00:16:13,300
en el que se creó la función.

306
00:16:13,300 --> 00:16:16,000
Luego, cada vez que no se puede encontrar una variable

307
00:16:16,000 --> 00:16:17,720
en el ámbito de la función,

308
00:16:17,720 --> 00:16:20,092
JavaScript buscará en la mochila.

309
00:16:20,092 --> 00:16:23,460
y toma la variable que falta de allí.

310
00:16:23,460 --> 00:16:26,358
Tan similar a las otras definiciones,

311
00:16:26,358 --> 00:16:30,110
pero tal vez un poco más visual.

312
00:16:30,110 --> 00:16:34,050
Estas son algunas formas diferentes de definir el cierre,

313
00:16:34,050 --> 00:16:36,350
pero todos significan lo mismo.

314
00:16:36,350 --> 00:16:38,973
Así que todos representan la misma idea.

315
00:16:39,890 --> 00:16:43,010
Finalmente, debemos entender que no

316
00:16:43,010 --> 00:16:45,520
tiene que crear cierres manualmente.

317
00:16:45,520 --> 00:16:47,859
Y esto es también lo que ya toqué

318
00:16:47,859 --> 00:16:50,690
al comienzo de la conferencia.

319
00:16:50,690 --> 00:16:53,880
Entonces, en cambio, esto es algo que JavaScript

320
00:16:53,880 --> 00:16:58,520
lo hace de forma totalmente automática, no tenemos que hacer nada.

321
00:16:58,520 --> 00:17:02,430
Además, no hay forma de que podamos acceder explícitamente

322
00:17:02,430 --> 00:17:04,500
cerrado sobre variables.

323
00:17:04,500 --> 00:17:08,290
Eso es porque los cierres no son como algo tangible.

324
00:17:08,290 --> 00:17:12,130
No son como un objeto o para que podamos acceder.

325
00:17:12,130 --> 00:17:14,544
Así que no podemos simplemente llegar a un cierre

326
00:17:14,544 --> 00:17:17,040
y tomar variables de él.

327
00:17:17,040 --> 00:17:19,660
Eso es imposible porque un cierre

328
00:17:19,660 --> 00:17:23,520
es sólo una propiedad interna de una función.

329
00:17:23,520 --> 00:17:26,073
Podemos observar que ocurre un cierre

330
00:17:26,073 --> 00:17:29,400
porque mágicamente las funciones siguen teniendo acceso

331
00:17:29,400 --> 00:17:32,730
a variables que ya no deberían existir,

332
00:17:32,730 --> 00:17:36,850
pero no podemos acceder directamente a estas variables.

333
00:17:36,850 --> 00:17:40,182
Sin embargo, lo que podemos hacer es echar un vistazo

334
00:17:40,182 --> 00:17:42,440
en esta propiedad interna.

335
00:17:42,440 --> 00:17:46,960
Así que en esta mochila, por así decirlo, en una consola.

336
00:17:46,960 --> 00:17:50,183
Así que hagámoslo rápidamente antes de terminar esta lección.

337
00:17:51,930 --> 00:17:55,320
Y podemos hacer esto usando console.dir

338
00:17:58,282 --> 00:18:01,270
y luego de la propia función de Booker.

339
00:18:01,270 --> 00:18:03,440
Tan similar a console.log

340
00:18:03,440 --> 00:18:06,100
pero este es un poco diferente.

341
00:18:06,100 --> 00:18:09,433
Y aquí ahora tenemos esta función en sí.

342
00:18:11,020 --> 00:18:14,290
Entonces podemos obtener los argumentos, la propiedad del nombre

343
00:18:14,290 --> 00:18:17,170
que ya echamos un vistazo antes.

344
00:18:17,170 --> 00:18:18,003
Y luego aquí abajo,

345
00:18:18,003 --> 00:18:20,993
tenemos la propiedad interna de este alcance.

346
00:18:21,860 --> 00:18:24,430
Y la propiedad de este ámbito interno aquí

347
00:18:24,430 --> 00:18:26,930
es básicamente el entorno variable

348
00:18:26,930 --> 00:18:28,393
de la función de Booker.

349
00:18:29,270 --> 00:18:31,774
Ahora aquí, podemos ver el cierre

350
00:18:31,774 --> 00:18:35,460
Viniendo de la reserva segura, ¿de acuerdo?

351
00:18:35,460 --> 00:18:38,520
Y aquí es donde vemos el número de pasajeros,

352
00:18:38,520 --> 00:18:41,540
que actualmente es de tres.

353
00:18:41,540 --> 00:18:44,267
Y entonces este cierre aquí básicamente,

354
00:18:44,267 --> 00:18:48,453
es el entorno variable de esta reserva segura.

355
00:18:50,100 --> 00:18:53,793
Así que ese es el que está siendo preservado por el cierre.

356
00:18:55,340 --> 00:18:56,970
¿Está bien?

357
00:18:56,970 --> 00:19:01,650
Y, por cierto, cada vez que vea estos corchetes dobles aquí,

358
00:19:01,650 --> 00:19:04,390
eso quiere decir que es una propiedad interna,

359
00:19:04,390 --> 00:19:06,603
a la que no podemos acceder desde nuestro código.

360
00:19:07,570 --> 00:19:11,920
Muy bien, este fue un video largo sobre los cierres.

361
00:19:11,920 --> 00:19:13,200
Ahora, en la próxima conferencia,

362
00:19:13,200 --> 00:19:16,080
vamos a echar un vistazo a tres ejemplos más

363
00:19:16,080 --> 00:19:19,940
de cierres y también analizar cómo funcionan,

364
00:19:19,940 --> 00:19:23,120
porque es muy importante que entiendas

365
00:19:23,120 --> 00:19:25,600
este concepto de cierres.

366
00:19:25,600 --> 00:19:29,071
Es una característica que se usa todo el tiempo en JavaScript.

367
00:19:29,071 --> 00:19:33,080
y muchas veces, aun sin que nos demos cuenta

368
00:19:33,080 --> 00:19:35,180
que los cierres están ocurriendo.

369
00:19:35,180 --> 00:19:38,272
Así que si quieres tener confianza como programador,

370
00:19:38,272 --> 00:19:40,730
siempre necesitas saber cómo exactamente

371
00:19:40,730 --> 00:19:43,100
todo en su código funciona.

372
00:19:43,100 --> 00:19:45,453
Y eso, por supuesto, incluye los cierres.