Ámbito de la función y ámbito del bloque
Cuando se declara una variable dentro de una función, la variable está ligada dentro de la función y no se puede acceder a ella fuera de la función. var
es la palabra clave para definir una variable para la accesibilidad al ámbito de la función.
Ahora bien, te preguntarás, si da un error aunque utilices let
o const
, ¿por qué sólo se asocia var
al ámbito de la función? La cosa es que let
y const
se utilizan para definir el ámbito de bloque, y antes de ES6, JavaScript no tenía ámbito de bloque o let
y const
.
Un ámbito de bloque es el área dentro de las condiciones
if
,switch
o los buclesfor
ywhile
. En pocas palabras, siempre que vea {corchetes}, es un bloque.
Veamos un ejemplo:
Ahora podrías esperar que ninguno de los comandos de registro debería funcionar pero como puedes ver ese no es el caso con var, las variables definidas con var dentro de las condiciones if
, switch
o los bucles for
y while
pueden ser accedidas globalmente y son parte del ámbito global y por lo tanto es mejor práctica usar let
y const
con ellas.
Alcance Léxico
Finalmente, hemos llegado al verdadero propósito de este post. Bueno, podría haberme saltado la larga discusión sobre el alcance pero, personalmente, no creo que se pueda entender el alcance léxico sin conocer los componentes clave que giran a su alrededor.
De nuevo, un punto a recordar: Javascript tiene ámbito léxico con ámbito de funciones.
En palabras sencillas, significa que el ámbito de los hijos tiene acceso a las variables definidas en el ámbito de los padres. Por ejemplo, si yo definiera una función y declarara una variable dentro de ella y dentro de la misma función, definiera otra función, entonces debería poder usar esa variable dentro de la función interna debido al alcance léxico. Veamos un ejemplo:
Se puede ver en el ejemplo, las variables declaradas en outerFunction()
son accedidas por innerfunction()
, esto es alcance léxico.
El alcance de las variables se define por su posición en el código. Para resolver las variables, JavaScript comienza en el ámbito más interno y busca hacia afuera hasta encontrar la variable que estaba buscando. En el ejemplo anterior, Javascript busca primero las variables dentro de innerFunction()
y cuando no la encuentra, sale fuera, es decir, outerFunction()
El ámbito clásico es mejor porque podemos averiguar fácilmente el valor de una variable a partir del código, mientras que en el ámbito dinámico, el significado de una variable puede cambiar en tiempo de ejecución, lo que hace que sea complejo de entender.
Así que, hemos entendido con éxito lo que es el ámbito léxico, ahora vamos a ver los cierres donde se utiliza realmente el ámbito léxico.