1
00:00:00,810 --> 00:00:01,580
Dar una buena acogida.

2
00:00:01,710 --> 00:00:04,150
En este video vamos a hablar sobre cierres.

3
00:00:04,800 --> 00:00:08,240
Los cierres son uno de los conceptos más desafiantes para entender.

4
00:00:08,370 --> 00:00:12,360
Pero una vez que realmente entiendes cuál es la definición y he visto un par de ellos, va

5
00:00:12,360 --> 00:00:13,570
a ser mucho más fácil.

6
00:00:13,950 --> 00:00:15,720
Entonces, ¿qué vamos a hacer en este video?

7
00:00:15,720 --> 00:00:18,950
Vamos a entender qué es un cierre y qué no es.

8
00:00:19,200 --> 00:00:22,460
Vamos a usar cierres para emular variables privadas.

9
00:00:22,680 --> 00:00:26,360
Vamos a enumerar algunos casos de uso para cierres en el mundo real.

10
00:00:27,210 --> 00:00:28,520
Entonces, ¿qué es un cierre?

11
00:00:28,830 --> 00:00:35,190
Un cierre es una función que hace uso de variables definidas en funciones externas que han

12
00:00:35,220 --> 00:00:36,180
regresado previamente.

13
00:00:36,690 --> 00:00:39,540
Entonces sé que esa definición podría no tener demasiado sentido en este momento.

14
00:00:39,690 --> 00:00:41,580
Así que veamos un ejemplo de inmediato.

15
00:00:42,030 --> 00:00:47,210
Voy a presionar la opción de comando Jay y abrir mis herramientas de desarrollo de Chrome.

16
00:00:47,370 --> 00:00:52,670
cierre es una función que utiliza bien las variables definidas en nuestras funciones, entonces hagamos una función externa.

17
00:00:52,800 --> 00:00:54,420
Ahora bien, si decimos que un

18
00:00:54,630 --> 00:01:01,410
Entonces haré una función llamada externa dentro de esta función amik una variable llamada datos que es igual a

19
00:01:01,410 --> 00:01:02,200
la cadena.

20
00:01:02,220 --> 00:01:06,680
Los cierres son un interior de la función externa.

21
00:01:06,690 --> 00:01:15,480
Devolveré una nueva función llamada Inner y dentro de esta función interna o haré una variable llamada datos internos y

22
00:01:15,510 --> 00:01:19,130
los datos internos son iguales a la cadena.

23
00:01:19,140 --> 00:01:20,520
Increíble.

24
00:01:21,570 --> 00:01:28,820
Ahora, dentro de esta función interna, voy a devolver los cierres de cuerdas con la cuerda.

25
00:01:28,830 --> 00:01:32,180
Increíble.

26
00:01:32,940 --> 00:01:34,660
Ahora llamemos a esta función externa.

27
00:01:35,400 --> 00:01:36,870
¿Y qué debería devolvernos?

28
00:01:36,990 --> 00:01:40,140
Bueno, va a devolver la definición de la función interna.

29
00:01:40,410 --> 00:01:46,800
Pero observe aquí que dentro de esta función interna estoy haciendo uso de una variable llamada datos que

30
00:01:46,800 --> 00:01:49,080
se definió en la función externa.

31
00:01:49,110 --> 00:01:55,280
Entonces cuando llamo a esta función externa y llamo a la función interna de inmediato, devuelve la cadena.

32
00:01:55,320 --> 00:01:57,480
Los cierres son increíbles

33
00:01:57,480 --> 00:02:03,930
Por lo tanto, quizás no veas realmente el poder de los cierres en este momento, pero este es solo un

34
00:02:04,230 --> 00:02:11,100
buen ejemplo del uso de variables definidas en funciones externas como esta variable de datos aquí dentro de una función interna.

35
00:02:11,100 --> 00:02:16,680
Cuando la función externa ya ha devuelto el aviso aquí, se devuelve la función

36
00:02:16,680 --> 00:02:22,730
externa pero aún puedo usar esta variable de datos aunque la función externa ya haya regresado.

37
00:02:23,610 --> 00:02:25,680
Echemos un vistazo a otro ejemplo.

38
00:02:25,950 --> 00:02:31,050
Aquí tengo una función llamada Outer que toma un parámetro A y devuelve una

39
00:02:31,080 --> 00:02:33,730
función llamada Inner que toma un parámetro b.

40
00:02:34,320 --> 00:02:40,980
A que se definió en la función externa y en el momento en que se llama que la función externa ha regresado.

41
00:02:40,980 --> 00:02:43,790
La función interna está haciendo uso de la variable

42
00:02:44,070 --> 00:02:50,610
Entonces esta función interna es un cierre al igual que el otro ejemplo que vimos un par de cosas para notar

43
00:02:50,610 --> 00:02:51,010
aquí.

44
00:02:51,060 --> 00:02:56,280
Tenemos que devolver la función interna para que esto funcione y también tenemos la capacidad de llamar

45
00:02:56,280 --> 00:03:01,620
a la función externa y luego llamar inmediatamente a la función interna o almacenar el resultado de la

46
00:03:01,620 --> 00:03:05,400
función interna en una variable y llamarla más tarde, lo que comúnmente hacemos.

47
00:03:05,970 --> 00:03:07,520
Probemos un ejercicio rápido.

48
00:03:07,680 --> 00:03:15,540
Vea si puede averiguar si alguna de estas funciones contiene un video de acertijo de cierre por un segundo.

49
00:03:15,750 --> 00:03:19,740
Está bien, ¿qué se te ocurrió en esta primera función?

50
00:03:19,740 --> 00:03:25,410
Podemos ver que la función interna no está haciendo uso de ninguna variable para encontrar en una función externa

51
00:03:25,410 --> 00:03:26,400
que ha regresado.

52
00:03:26,550 --> 00:03:31,320
Entonces este aquí no contiene un cierre en el segundo ejemplo.

53
00:03:31,320 --> 00:03:36,900
Podemos ver que la función interna está haciendo uso de una variable llamada datos que se definió en una

54
00:03:36,900 --> 00:03:41,610
función externa que ha regresado en el momento en que se llamará a la función interna.

55
00:03:42,030 --> 00:03:47,980
Entonces, el primero no lo es, pero el segundo siempre regresa a la definición de cierre.

56
00:03:48,150 --> 00:03:54,030
no está haciendo uso de variables en una función externa, probablemente no sea un cierre.

57
00:03:54,090 --> 00:03:56,650
Y si ves que la función interna

58
00:03:56,820 --> 00:03:58,520
Entonces, ¿cuándo usarías un cierre?

59
00:03:58,920 --> 00:04:04,200
Bueno, un gran caso de uso para cierres es crear la idea de una variable privada en otros idiomas.

60
00:04:04,200 --> 00:04:08,640
Existe soporte para las variables que no se pueden modificar externamente que llamamos variables

61
00:04:08,790 --> 00:04:11,520
privadas pero en javascript no tenemos eso incorporado.

62
00:04:11,520 --> 00:04:13,780
Afortunadamente, los cierres pueden ayudarnos con eso.

63
00:04:13,800 --> 00:04:18,810
Así que echemos un vistazo a este ejemplo en las herramientas de desarrollo de Chrome en una opción de comando

64
00:04:18,810 --> 00:04:23,960
de prensa Jagan y abrir eso y voy a escribir una función llamada contador y dentro de esta función de contador.

65
00:04:23,970 --> 00:04:30,000
Voy a hacer una variable llamada conteo de modo que sea igual a cero y dentro de esta función de

66
00:04:30,090 --> 00:04:32,290
contador voy a devolver una nueva función.

67
00:04:32,340 --> 00:04:35,460
No me aviso aquí que no estoy dando un nombre a esta función.

68
00:04:35,460 --> 00:04:38,360
Eso es porque estas funciones son anónimas.

69
00:04:38,490 --> 00:04:45,100
Entonces, si quiero nombrar esta función, puedo llamar a esto algo así como contar, pero no es necesario.

70
00:04:45,210 --> 00:04:50,230
Y dentro de esta función interna voy a devolver el recuento plus plus.

71
00:04:50,250 --> 00:04:55,380
Y la razón por la que estoy haciendo más más aquí como operador de prefijo es por lo

72
00:04:55,380 --> 00:04:58,280
que la primera vez que la llamo va hasta 1.

73
00:04:58,290 --> 00:05:04,500
Ahora puedo configurar esta función de contador para que sea igual a una variable llamada C y voy a

74
00:05:04,530 --> 00:05:07,010
guardar R C es igual a contador.

75
00:05:07,020 --> 00:05:10,130
Ahora, ¿qué crees que va a ser C cuando lo eche un vistazo?

76
00:05:10,800 --> 00:05:12,230
Bueno, como vimos antes.

77
00:05:12,300 --> 00:05:19,440
Va a ser una definición de función y si vuelvo a llamar a C voy a devolver el conteo

78
00:05:19,590 --> 00:05:20,600
incrementado en 1.

79
00:05:20,670 --> 00:05:23,060
Vamos a llamarlo una y otra vez.

80
00:05:23,220 --> 00:05:29,790
realmente bueno de esto es que nadie tiene acceso al conteo de variables en el alcance en el que estoy ahora.

81
00:05:29,790 --> 00:05:30,920
Pero lo que es

82
00:05:31,050 --> 00:05:35,230
Si intento acceder al conteo, obtendré una referencia que dice que el recuento no está definido.

83
00:05:35,370 --> 00:05:41,040
Y dado que el recuento es una variable privada, nadie puede entrar y cambiar con el valor del

84
00:05:41,040 --> 00:05:43,360
recuento que comienza siempre va a ser cero.

85
00:05:43,440 --> 00:05:46,810
Detenga el video e intente copiar este ejemplo en la consola de Chrome.

86
00:05:46,910 --> 00:05:50,210
Ayudará mucho a comprender cómo funcionan los cierres.

87
00:05:50,880 --> 00:05:56,780
Echemos un vistazo a otro ejemplo de variables privadas dentro de esta función de clase.

88
00:05:56,790 --> 00:06:01,770
Tengo una variable llamada instructores que es una matriz de dos cadenas llamada LP.

89
00:06:01,830 --> 00:06:06,240
Esta función de aula devuelve un objeto con dos funciones.

90
00:06:06,450 --> 00:06:13,320
Obtener instructores y un instructor obtener instructores me permite mostrar desorientado en el instructor es una función

91
00:06:13,410 --> 00:06:18,500
que toma un parámetro y lo agrega a la matriz del instructor.

92
00:06:18,570 --> 00:06:20,960
Entonces, ¿dónde está el cierre aquí?

93
00:06:21,180 --> 00:06:24,640
Tenga en cuenta que los instructores GET tienen una función de agregar instructor.

94
00:06:24,720 --> 00:06:31,860
Ambos hacen uso de la variable de este instructor que está fuera de esta función aquí y de

95
00:06:31,860 --> 00:06:33,060
esta función aquí.

96
00:06:33,060 --> 00:06:40,320
instructores y agregan que el instructor está usando variables definidas en funciones externas que ya han regresado.

97
00:06:40,680 --> 00:06:42,750
Entonces estas dos funciones obtienen

98
00:06:42,750 --> 00:06:48,750
Pueden ver que aquí obtienen instructores que me permiten imprimir la matriz de Ellen potro y el instructor me

99
00:06:48,870 --> 00:06:52,250
permite agregar un instructor a esa matriz y devolver la teoría.

100
00:06:52,620 --> 00:06:58,470
Pero cuando creo un aula nueva con otra variable y obtengo los instructores, podemos ver que

101
00:06:58,470 --> 00:06:59,920
Ian no está aquí.

102
00:07:00,000 --> 00:07:06,810
Finalmente, mediante el uso de cierre hemos hecho que los instructores sean variables aquí una variable privada.

103
00:07:06,810 --> 00:07:12,990
Nadie puede modificarlo así que cada vez que se crea un aula, los instructores que recibe

104
00:07:12,990 --> 00:07:14,530
siempre se llamarán callejón.

105
00:07:14,760 --> 00:07:19,380
Parece que estás atrapado con nosotros por un tiempo, así que, aunque aquí tenemos un

106
00:07:19,680 --> 00:07:24,440
pequeño ejemplo, muchas herramientas y tecnologías de las que aprenderás hacen bastante uso de los cierres.

107
00:07:24,540 --> 00:07:28,560
Entonces, cuando estés viendo algo de ese código haz tu mejor esfuerzo para ver si puedes ver dónde están

108
00:07:28,560 --> 00:07:29,050
esos cierres.

109
00:07:29,250 --> 00:07:31,680
Bueno, asegúrese de señalarle a usted también.

110
00:07:31,680 --> 00:07:32,830
Entonces, ¿qué aprendemos?

111
00:07:32,850 --> 00:07:38,550
Existe un cierre cuando una función interna hace uso de las variables declaradas en la función externa

112
00:07:38,550 --> 00:07:41,480
que ya ha regresado y el cierre no existe.

113
00:07:41,490 --> 00:07:47,250
Si no devuelve una función interna y si esa función interna no utiliza variables devueltas por

114
00:07:47,310 --> 00:07:52,980
una función externa, también vimos que podemos usar cierres para crear variables privadas y escribir

115
00:07:52,980 --> 00:07:56,770
un código mejor para aislar nuestra lógica y nuestra aplicación.

116
00:07:57,690 --> 00:07:58,830
Y eso es todo por cierres.

117
00:07:58,830 --> 00:07:59,710
Nos vemos en el siguiente video
