Diego Orozco by Diego Orozco on December 7, 2023

100 Días de Javascript - 4 de 100 - Visibilidad de variables

En este día he decidido escribir sobre la visibilidad de variables, o variable scope, en JS.

Es importante conocer el comportamiento de JS con respecto al scope que tiene una variable a fin de evitar problemas con la sobreescritura accidental de estas, así como para comprender qué variables están disponibles en diferentes partes del código..

#Happy Coding!

Variable scopes

En JS hay tres tipos principales de scopes:

  • Global scope: Las variables declaradas fuera de cualquier función tienen un alcance o scope global. Esto significa que pueden ser accedidas desde cualquier parte del código, ya sea dentro de funciones, bloques o en el nivel superior del archivo.
var globalVariable = "Hola"; // Variable global

function miFuncion() {
  console.log(globalVariable); // Se puede acceder a globalVariable aquí
}
  • Local scope (funcional o block scope): Las variables declaradas dentro de una función o un bloque (introducido por las sentencias let o const desde ES6) tienen un alcance local. Estas variables solo son accesibles dentro de la función o bloque donde fueron declaradas.
function miFuncion() {
  var localVariable = "Hola"; // Variable local

  if (true) {
    let blockVariable = "Hola desde el bloque"; // Variable de bloque
    console.log(localVariable); // Se puede acceder a localVariable aquí
    console.log(blockVariable); // Solo se puede acceder a blockVariable aquí
  }

  console.log(localVariable); // Se puede acceder a localVariable aquí
  // console.log(blockVariable); // Esto causaría un error, blockVariable no está disponible aquí
}
  • Lexical scope: En JS las funciones pueden acceder a variables definidas en su entorno léxico, es decir, las variables definidas fuera de la función pero dentro de su alcance exterior (como una función que contiene otra función).
function exterior() {
  var externalVariable = "Externa";

  function interior() {
    console.log(externalVariable); // interior() puede acceder a externalVariable de exterior()
  }

  interior();
}

exterior(); //

El uso de lexical scope facilita la creación de código más limpio, modular y seguro, permitiendo el control del acceso a las variables y protegiendo la lógica interna de funciones.

Variable shadowing

En distintas ocasiones nos vamos a encontrar este caso en la declaración de variables, el cual ocurre cuando una variable local tiene el mismo nombre que una variable en un scope superior, lo que oculta temporalmente el acceso a la variable de alcance superior. Es decir: el scope local tiene precedencia dentro del bloque donde se encuentre declarada la variable, de tal manera que ya no se podrá tener acceso a la variable con el mismo nombre que se encuentra en otro scope.

// Variable global
var variable = "Variable global";

function ejemploShadowing() {
  // Nueva variable dentro de la función con el mismo nombre que la variable global
  var variable = "Variable local";

  console.log("Variable local:", variable); // Imprimirá "Variable local"
}

ejemploShadowing(); // Llama a la función

console.log("Variable global:", variable); // Imprimirá "Variable global"

En este caso, la función ejemploShadowing tiene una variable local llamada variable, que tiene el mismo nombre que la variable global variable. Dentro de la función, cuando se hace referencia a variable, se accede a la versión local y no a la variable global con el mismo nombre. Esto es el shadowing: la variable local hace sombra a la variable global temporalmente dentro del ámbito de la función, pero fuera de ella, el acceso sigue siendo a la variable global.

<< JS - Funciones en Javascript | JS - Llamando funciones >>