El siguiente tema del que tenemos que hablar
es un concepto muy mal entendido en JavaScript
y eso es izar.
Entonces aprendimos que un contexto de ejecución
siempre contiene tres partes.
Un entorno variable,
la cadena de alcance en el contexto actual,
y la palabra clave del disco.
Ya aprendimos sobre la cadena de alcance
y ahora es el momento de echar un vistazo más de cerca
en el entorno variable
y en particular en cómo las variables
en realidad se crean en JavaScript.
Entonces en JavaScript
tenemos un mecanismo llamado elevación.
Y izar básicamente hacer
algunos tipos de variables accesibles,
o digamos usable en el código
antes de que se declaren en el código.
Ahora, muchas personas simplemente definen el levantamiento
diciendo que las variables se levantan mágicamente
o movido a la parte superior de su alcance
por ejemplo, en la parte superior de una función.
Y eso es en realidad lo que iza
parece en la superficie.
Pero detrás de escena
de hecho, eso no es lo que sucede.
En cambio, detrás de escena
el código es básicamente escaneado
para declaraciones de variables antes de que se ejecute.
Así que esto sucede durante el llamado
fase de creación del contexto de ejecución
que hablábamos antes.
Luego, para cada variable que se encuentra en el código,
se crea una nueva propiedad
en un objeto de entorno variable.
Y así es como funciona realmente la elevación.
Ahora, izar no funciona igual
para todos los tipos de variables.
Y entonces, analicemos la forma en que funciona el alojamiento.
para declaraciones de funciones,
variables definidas con var
variables definidas con let o const
y expresiones de funciones,
y también funciones de flecha.
Entonces, las declaraciones de funciones en realidad se elevan
y el valor inicial en la variable entorno
se establece en la función real.
Así que en la práctica, lo que esto significa
es que podemos usar declaraciones de funciones
antes de que se declaren en el código,
de nuevo, porque se almacenan
en el objeto de entorno variable,
incluso antes de que el código comience a ejecutarse.
Y en realidad te lo dije antes
que las declaraciones de funciones funcionan de esta manera,
pero ahora entiendes por qué.
Es por izar.
Y solo para hacer esta tabla un poco más completa
para que sirva como una buena descripción general para usted,
También muestro aquí que las declaraciones de función
tienen un alcance de bloque como aprendimos antes.
Sólo tenga en cuenta que esto es sólo cierto
para el modo estricto.
Entonces, si está usando un modo descuidado,
que no deberías,
entonces las funciones se funcionan esculpir.
A continuación, las variables declaradas con var.
también se izan, pero la elevación funciona
de una manera diferente aquí.
Entonces, a diferencia de las funciones,
cuando intentamos acceder a una variable var
antes de que se declare en un código,
no obtenemos el valor declarado
pero nos quedamos indefinidos.
Y este es un comportamiento realmente extraño para los principiantes.
Puede esperar que simplemente obtenga un error
cuando se usa una variable antes de declararla
o para obtener el valor real.
Pero para no quedar indefinido
porque ser indefinido es realmente extraño
y tampoco es realmente útil, ¿verdad?
Y en realidad este comportamiento
es una fuente común de errores en JavaScript.
Así que esta es una de las principales razones
por qué en JavaScript moderno
casi nunca usamos var.
Ahora por otro lado,
Las variables let y const no se elevan.
Quiero decir, técnicamente en realidad están izados.
pero su valor se establece básicamente en un valor inicializado.
Así que no hay valor para trabajar en absoluto.
Y así, en la práctica, es como si izaran
no estaba pasando en absoluto.
En su lugar, decimos que estas variables
se colocan en una llamada Zona Muerta Temporal o TDZ
lo que hace que no podamos acceder a las variables
entre el comienzo del alcance
y al lugar donde se declaran las variables.
Entonces como consecuencia,
si intentamos usar una variable let o const
antes de que se declare, obtenemos un error.
También tenga en cuenta que let y const tienen un alcance de bloque.
Entonces solo existen en el bloque.
en que fueron creados.
Y todos estos factores juntos
es básicamente la razón por la que let y const
se introdujeron por primera vez en el idioma,
y por qué los usamos ahora en lugar de var
en JavaScript moderno.
Bueno.
Pero ahora, ¿qué pasa con las expresiones de funciones?
y funciones de flecha?
¿Cómo funciona la elevación para esto?
Bueno, depende si fueron creados.
usando var o const o let.
Porque ten en cuenta que estas funciones
son simplemente variables.
Y entonces se comportan exactamente de la misma manera.
como variables con respecto al izaje.
Esto significa que una expresión de función
o función de flecha creada con var
se eleva a indefinido.
Pero si se crea con let o const,
no se puede usar antes de que se declare en un código
debido a la Zona Muerta Temporal
así que de nuevo, al igual que las variables normales, ¿verdad?
Y esta es en realidad la razón por la que te dije antes
que no podemos usar expresiones de función
antes de escribirlos en el código,
a diferencia de las declaraciones de funciones.
Bueno.
Pero ahora antes de terminar,
echemos un vistazo más detallado
en esta misteriosa Zona Muerta Temporal.
Así que en este código de ejemplo
vamos a ver la variable del trabajo.
Es una const, por lo que tiene un alcance solo para este bloque if
y va a ser accesible
a partir de la línea donde se define.
¿Por qué?
Bueno, porque existe esta Zona Muerta Temporal
para la variable del trabajo.
Es básicamente la región del alcance.
en el que se define la variable,
pero no se puede usar de ninguna manera.
Entonces es como si la variable ni siquiera existiera.
Ahora, si aún intentáramos acceder a la variable
mientras que en la TDZ como en realidad
do en la primera línea de este bloque if,
entonces obtenemos un error de referencia
diciéndonos que no podemos acceder al trabajo
antes de la inicialización.
Exactamente como aprendimos
en la última diapositiva, ¿verdad?
Sin embargo, si tratamos de acceder a una variable
que en realidad ni siquiera fue creado,
como en la última línea aquí
donde queremos registrar x,
entonces recibimos un mensaje de error diferente
diciendo que x no está definida en absoluto.
Lo que esto significa es que el trabajo es
de hecho en la Zona Muerta Temporal
donde todavía está inicializado,
pero el motor sabe que lo hará
eventualmente ser inicializado
porque ya leyó el código antes
y establecer la variable de trabajo en el entorno variable
a no inicializado.
Luego, cuando la ejecución llega a la línea
donde se declara la variable,
se elimina de la Zona Muerta Temporal
y entonces es seguro de usar.
Para recapitular, básicamente todos y cada uno
let y const variable obtienen su propia
Zona Muerta Temporal que comienza
al principio del alcance
hasta la línea donde se define.
Y la variable solo es segura de usar
después de la TDZ,
por lo que la Zona Muerta Temporal.
Muy bien, ahora cuál es realmente la necesidad
para que JavaScript tenga una zona muerta temporal?
Bueno, la razón principal por la que TDZ
se introdujo en ES6 es que
el comportamiento que describí antes
hace que sea mucho más fácil evitar y detectar errores.
Porque usar una variable que está configurada como indefinida
antes de que sea realmente declarado
puede causar errores graves
que puede ser difícil de encontrar.
Y les mostraré un pequeño ejemplo.
en la próxima conferencia.
Así que acceder a las variables antes de la declaración
es una mala práctica y debe evitarse.
Y la mejor forma de evitarlo
es simplemente obteniendo un error
cuando intentamos hacerlo.
Y eso es exactamente lo que hace una zona muerta temporal.
Una segunda y menor razón por la que existe la TDZ
es hacer variables constantes
realmente funcionan de la manera en que se supone que deben hacerlo.
Entonces, como saben, no podemos reasignar variables constantes.
Así que no será posible
para configurarlos como indefinidos primero
y luego asignar su valor real más adelante.
Const nunca debe reasignarse.
Y por lo tanto, solo se asigna cuando se ejecuta
realmente llega a la declaración.
Y eso lo hace imposible
para usar la variable antes.
¿Bueno? ¿Tiene sentido?
Ahora, si la elevación crea tantos problemas,
¿Por qué existe en primer lugar?
Me hacen esta pregunta todo el tiempo.
Y entonces, hablemos rápidamente de eso aquí.
Así que el creador de JavaScript básicamente
izaje implementado
para que podamos usar declaraciones de funciones
antes de que los usemos.
porque esto es fundamental
para algunas técnicas de programación,
como la recursividad mutua.
Algunas personas también piensan que hace código
mucho más legible.
Ahora, el hecho de que también funcione para declaraciones var
es porque esa era la única forma de izar
podría implementarse en su momento.
Así que el izado de variables var
es básicamente solo un subproducto
de las funciones de elevación.
Y probablemente parecía una buena idea.
para simplemente establecer las variables en indefinidas,
que en retrospectiva no es realmente tan bueno.
Pero debemos recordar que JavaScript
nunca tuvo la intención de convertirse en el enorme
lenguaje de programación que es hoy.
Además, no podemos eliminar esta función.
del lenguaje ahora.
Entonces, solo usamos let y const para solucionar esto.
Muy bien, genial.
Y con todo lo dicho,
Ahora trabajemos en algunos ejemplos prácticos de elevación.