1
00:00:01,380 --> 00:00:03,920
Nuestro próximo tema es algo llamado,

2
00:00:03,920 --> 00:00:07,240
Expresiones de funciones invocadas inmediatamente.

3
00:00:07,240 --> 00:00:09,703
Así que echemos un vistazo a lo que son.

4
00:00:11,290 --> 00:00:13,460
Así que a veces en JavaScript,

5
00:00:13,460 --> 00:00:16,960
necesitamos una función que solo se ejecute una vez.

6
00:00:16,960 --> 00:00:18,850
Y luego nunca más.

7
00:00:18,850 --> 00:00:20,430
Así que básicamente una función

8
00:00:20,430 --> 00:00:24,040
que desaparece justo después de que se llama una vez.

9
00:00:24,040 --> 00:00:25,670
Y esto podría no aparecer

10
00:00:25,670 --> 00:00:27,870
tener mucho sentido en este momento.

11
00:00:27,870 --> 00:00:30,330
Pero en realidad necesitamos esta técnica más adelante.

12
00:00:30,330 --> 00:00:33,950
Por ejemplo, con algo llamado async/await.

13
00:00:33,950 --> 00:00:36,220
Entonces, ¿cómo podríamos hacer eso?

14
00:00:36,220 --> 00:00:38,940
Bueno, podríamos simplemente crear una función.

15
00:00:38,940 --> 00:00:41,003
Y luego solo ejecutarlo una vez.

16
00:00:42,130 --> 00:00:46,913
Entonces, ejecute, una vez, la función.

17
00:00:51,600 --> 00:00:55,390
Esto nunca volverá a ejecutarse.

18
00:00:55,390 --> 00:00:56,933
Y entonces podemos llamarlo aquí.

19
00:00:59,700 --> 00:01:03,050
Sin embargo, podemos ejecutar esta función de nuevo.

20
00:01:03,050 --> 00:01:05,060
En algún otro punto del código,

21
00:01:05,060 --> 00:01:07,120
si queremos, ¿no?

22
00:01:07,120 --> 00:01:08,540
No hay nada que nos detenga,

23
00:01:08,540 --> 00:01:13,540
de más tarde hacer correr una vez más, ¿verdad?

24
00:01:14,040 --> 00:01:16,560
Y entonces esto no es lo que queremos hacer.

25
00:01:16,560 --> 00:01:20,020
Queremos ejecutar una función de inmediato.

26
00:01:20,020 --> 00:01:22,670
Y ni siquiera tener que guardarlo en alguna parte.

27
00:01:22,670 --> 00:01:25,550
Y así es como lo hacemos.

28
00:01:25,550 --> 00:01:29,483
Así que simplemente escribimos la expresión de la función en sí.

29
00:01:31,700 --> 00:01:35,030
Así que sin asignarlo a ninguna variable.

30
00:01:35,030 --> 00:01:36,640
Ahora, si tratamos de ejecutar esto,

31
00:01:36,640 --> 00:01:38,673
obtendremos un error por ahora.

32
00:01:40,020 --> 00:01:44,530
Entonces dice que las declaraciones de función requieren un nombre de función.

33
00:01:44,530 --> 00:01:45,490
Y eso es porque

34
00:01:45,490 --> 00:01:49,970
por supuesto, JavaScript aquí espera una declaración de función.

35
00:01:49,970 --> 00:01:53,000
Porque simplemente comenzamos esta línea de código aquí

36
00:01:53,000 --> 00:01:54,940
con la palabra clave función.

37
00:01:54,940 --> 00:01:57,920
Sin embargo, todavía podemos engañar a JavaScript

38
00:01:57,920 --> 00:02:01,410
en pensar que esto es sólo una expresión.

39
00:02:01,410 --> 00:02:03,700
Y lo hacemos simplemente envolviendo todo

40
00:02:03,700 --> 00:02:06,350
de esto entre paréntesis.

41
00:02:06,350 --> 00:02:07,970
Y ahora,

42
00:02:07,970 --> 00:02:11,560
básicamente transformamos la declaración que teníamos antes

43
00:02:11,560 --> 00:02:12,853
en una expresión.

44
00:02:13,780 --> 00:02:15,720
Y ahora si guardamos esto,

45
00:02:15,720 --> 00:02:17,350
no obtenemos ningún error.

46
00:02:17,350 --> 00:02:20,960
Pero también esta función aún no se ejecutó, ¿verdad?

47
00:02:20,960 --> 00:02:22,053
Nunca lo llamamos.

48
00:02:23,290 --> 00:02:25,720
Así que sabemos que esto aquí es la función.

49
00:02:25,720 --> 00:02:28,700
Y así, podemos llamarlo inmediatamente.

50
00:02:28,700 --> 00:02:29,650
Y así con esto,

51
00:02:29,650 --> 00:02:32,210
obtendremos ahora este texto aquí bloqueado

52
00:02:32,210 --> 00:02:33,823
a la consola, a la cadena.

53
00:02:34,880 --> 00:02:38,360
Y de hecho aquí está, ¿de acuerdo?

54
00:02:38,360 --> 00:02:40,210
Así que de nuevo esto aquí,

55
00:02:40,210 --> 00:02:43,090
es realmente solo el valor de la función.

56
00:02:43,090 --> 00:02:45,570
Entonces es solo una expresión de función.

57
00:02:45,570 --> 00:02:47,997
Y luego inmediatamente, lo llamamos aquí.

58
00:02:47,997 --> 00:02:50,780
Y por eso este patrón aquí,

59
00:02:50,780 --> 00:02:54,293
se denomina expresión de función invocada inmediatamente.

60
00:02:55,280 --> 00:02:56,600
O IIFE para abreviar.

61
00:02:56,600 --> 00:03:00,540
Expresión de función inmediatamente invocada.

62
00:03:00,540 --> 00:03:02,990
Y lo mismo sería, por supuesto,

63
00:03:02,990 --> 00:03:06,123
también funcionan para una función de flecha.

64
00:03:07,760 --> 00:03:09,313
Así que copiemos esto.

65
00:03:11,090 --> 00:03:14,470
Esto tampoco volverá a ejecutarse.

66
00:03:14,470 --> 00:03:17,910
Entonces, si tratamos de llamarlo así,

67
00:03:17,910 --> 00:03:19,550
entonces no funcionaria.

68
00:03:19,550 --> 00:03:21,090
Y entonces,

69
00:03:21,090 --> 00:03:22,700
en realidad no obtenemos un error.

70
00:03:22,700 --> 00:03:24,470
Pero tampoco pasa nada.

71
00:03:24,470 --> 00:03:27,200
Así que primero tenemos que envolver esto entre paréntesis.

72
00:03:27,200 --> 00:03:29,193
Y luego como lo llamamos.

73
00:03:30,610 --> 00:03:31,593
Entonces aquí está.

74
00:03:32,650 --> 00:03:34,910
Bien, entonces dos formas de escribir.

75
00:03:34,910 --> 00:03:37,543
una expresión de función invocada inmediatamente.

76
00:03:38,540 --> 00:03:39,850
Pero te estarás preguntando,

77
00:03:39,850 --> 00:03:43,490
¿Por qué se inventó realmente este patrón?

78
00:03:43,490 --> 00:03:48,490
Bueno, ya sabemos que las funciones crean ámbitos, ¿verdad?

79
00:03:48,690 --> 00:03:49,950
Y lo que es importante aquí

80
00:03:49,950 --> 00:03:52,530
es que un alcance no tiene acceso

81
00:03:52,530 --> 00:03:56,300
a variables desde un ámbito interno, ¿verdad?

82
00:03:56,300 --> 00:03:59,750
Por ejemplo, aquí mismo en este ámbito global.

83
00:03:59,750 --> 00:04:02,370
No tenemos acceso a ninguna variable que

84
00:04:02,370 --> 00:04:04,170
se definen en el alcance

85
00:04:04,170 --> 00:04:06,823
de alguna de estas funciones aquí, ¿verdad?

86
00:04:07,870 --> 00:04:09,123
Así por ejemplo,

87
00:04:10,360 --> 00:04:12,763
agreguemos una variable aquí.

88
00:04:14,220 --> 00:04:16,813
Digamos, es privado = 23.

89
00:04:18,040 --> 00:04:21,623
Y luego, cuando tratamos de acceder a él aquí.

90
00:04:22,950 --> 00:04:26,970
Ya sabes que no va a funcionar, ¿verdad?

91
00:04:26,970 --> 00:04:28,570
Y eso es porque la cadena de alcance

92
00:04:28,570 --> 00:04:31,410
solo funciona al revés.

93
00:04:31,410 --> 00:04:33,410
Entonces el alcance interno tendría acceso

94
00:04:33,410 --> 00:04:35,700
a cualquier cosa definida fuera,

95
00:04:35,700 --> 00:04:37,040
aquí en el ámbito global.

96
00:04:37,040 --> 00:04:38,240
Pero al revés,

97
00:04:38,240 --> 00:04:40,963
el ámbito global no tiene acceso a nada,

98
00:04:40,963 --> 00:04:43,530
que está dentro de un alcance.

99
00:04:43,530 --> 00:04:44,600
Entonces, en este caso,

100
00:04:44,600 --> 00:04:47,810
del alcance creado por esta función aquí.

101
00:04:47,810 --> 00:04:50,490
Por lo tanto, decimos que todos los datos definidos

102
00:04:50,490 --> 00:04:53,350
dentro de un alcance es privado.

103
00:04:53,350 --> 00:04:56,720
También decimos que estos datos están encapsulados.

104
00:04:56,720 --> 00:04:59,230
Entonces, por ejemplo, esto es privado aquí.

105
00:04:59,230 --> 00:05:03,330
está encapsulado dentro del alcance de esta función,

106
00:05:03,330 --> 00:05:04,960
que se crea aquí.

107
00:05:04,960 --> 00:05:08,120
Y encapsulación de datos y privacidad de datos.

108
00:05:08,120 --> 00:05:12,000
son conceptos extremadamente importantes en la programación.

109
00:05:12,000 --> 00:05:16,040
Muchas veces necesitamos proteger nuestras variables,

110
00:05:16,040 --> 00:05:19,450
de ser sobrescrito accidentalmente por otras partes

111
00:05:19,450 --> 00:05:20,660
Del programa.

112
00:05:20,660 --> 00:05:24,070
O incluso con scripts o bibliotecas externas.

113
00:05:24,070 --> 00:05:25,980
Y voy a hablar en detalle sobre

114
00:05:25,980 --> 00:05:29,670
estos conceptos en la sección de programación orientada a objetos.

115
00:05:29,670 --> 00:05:32,360
Pero por ahora, tenga en cuenta que es importante

116
00:05:32,360 --> 00:05:33,550
para ocultar variables.

117
00:05:33,550 --> 00:05:36,870
Y que los ámbitos son una buena herramienta para hacer esto.

118
00:05:36,870 --> 00:05:38,700
Y esta es también la razón por la cual

119
00:05:38,700 --> 00:05:43,030
Se inventaron las expresiones de funciones inmediatamente invocadas.

120
00:05:43,030 --> 00:05:45,120
Básicamente, este patrón aquí.

121
00:05:45,120 --> 00:05:48,670
Entonces, esta no es realmente una característica del lenguaje JavaScript.

122
00:05:48,670 --> 00:05:52,350
Es más un patrón que se les ocurrió a algunos desarrolladores.

123
00:05:52,350 --> 00:05:54,570
Y que luego empezó a ser utilizado,

124
00:05:54,570 --> 00:05:56,133
por muchos otros desarrolladores.

125
00:05:57,090 --> 00:06:01,193
Ahora, ¿recuerdas lo que también crea un alcance en ES6?

126
00:06:02,090 --> 00:06:03,170
Y eso es correcto.

127
00:06:03,170 --> 00:06:06,310
Variables declaradas con let o const create

128
00:06:06,310 --> 00:06:08,830
su propio alcance dentro de un bloque.

129
00:06:08,830 --> 00:06:09,670
Y aprendimos que

130
00:06:09,670 --> 00:06:13,060
en la sección detrás de escena, ¿recuerdas?

131
00:06:13,060 --> 00:06:16,100
Así que cuando creamos un bloque, como este,

132
00:06:16,100 --> 00:06:18,963
y declarar es privado allí.

133
00:06:22,730 --> 00:06:26,303
Entonces el exterior todavía no puede acceder es privado.

134
00:06:28,210 --> 00:06:30,150
Así que vamos a comentar este,

135
00:06:30,150 --> 00:06:31,253
y pégalo aquí.

136
00:06:32,180 --> 00:06:33,480
Una vez mas,

137
00:06:33,480 --> 00:06:36,000
no podemos acceder a esta variable.

138
00:06:36,000 --> 00:06:37,363
mientras que por otro lado,

139
00:06:39,200 --> 00:06:40,670
este de aquí,

140
00:06:40,670 --> 00:06:43,363
por supuesto, sería accesible.

141
00:06:46,350 --> 00:06:48,423
Y de nuevo eso es lo que aprendimos,

142
00:06:49,740 --> 00:06:52,140
en uno de los apartados anteriores.

143
00:06:52,140 --> 00:06:55,900
Entonces eso es porque este aquí fue declarado con var,

144
00:06:55,900 --> 00:06:58,770
y por lo tanto ignora por completo

145
00:06:58,770 --> 00:07:00,930
este bloque aquí esencialmente.

146
00:07:00,930 --> 00:07:03,140
Y esta es la razón por la que ahora

147
00:07:03,140 --> 00:07:05,220
en JavaScript moderno.

148
00:07:05,220 --> 00:07:08,160
Las expresiones de función invocadas inmediatamente no son

149
00:07:08,160 --> 00:07:09,520
que usó más.

150
00:07:09,520 --> 00:07:10,970
Porque si todo lo que queremos

151
00:07:10,970 --> 00:07:13,890
es crear un nuevo ámbito para la privacidad de los datos.

152
00:07:13,890 --> 00:07:15,110
Todo lo que tenemos que hacer,

153
00:07:15,110 --> 00:07:18,430
es simplemente crear un bloque como este, ¿verdad?

154
00:07:18,430 --> 00:07:20,780
No hay necesidad de crear una función.

155
00:07:20,780 --> 00:07:22,500
para crear un nuevo ámbito.

156
00:07:22,500 --> 00:07:23,350
A menos que, por supuesto,

157
00:07:23,350 --> 00:07:26,490
queremos usar var para nuestras variables.

158
00:07:26,490 --> 00:07:28,400
Pero ya sabemos,

159
00:07:28,400 --> 00:07:31,430
probablemente no deberíamos hacer eso. ¿Bien?

160
00:07:31,430 --> 00:07:32,840
Ahora por otro lado,

161
00:07:32,840 --> 00:07:34,300
si lo que realmente necesitas,

162
00:07:34,300 --> 00:07:38,290
es ejecutar una función solo una vez, luego el IIFE.

163
00:07:38,290 --> 00:07:41,560
Entonces, el patrón de expresión de función invocada inmediatamente

164
00:07:41,560 --> 00:07:43,260
sigue siendo el camino a seguir.

165
00:07:43,260 --> 00:07:45,860
Incluso ahora con JavaScript moderno.

166
00:07:45,860 --> 00:07:48,584
Y de hecho veremos un gran caso de uso un poco más tarde.

167
00:07:48,584 --> 00:07:50,253
de hacer un IIFE.