Alcance "Scope"
Podemos decir que alcance dentro de JavaScript se refiere al conjunto de reglas que nos indica donde y como el interpretador de JavaScript puede encontrar variables en su ejecucion. Este define en que area del codigo las variables estan disponible para utilizarlas. Las variables normalmente pertenecen a su propio contexto de ejecución "context of execution", este contexto indica cuando la variable, valor o expresion puede ser visible o usada por medio de referencia. Variables fuera del contexto, no podemos acceder a ellas.
contexto de ejecución "context of execution"
Cuando el codigo es ejecutado, este es ejecutado bajo un contexto de ejecucion. Cuando hablamos de contexto se refiere a la definicion de contexto, todo aquello que rodea, ya sea simbólicamente, a un acontecimiento en este caso la ejecucion del codigo. A partir del contexto, por lo tanto, se puede interpretar o entender un hecho.
Tipos de alcance:
- Global - las variables definidas bajo este alcance, viven dentro de la ejecucion completa de la aplicacion, esta pueden ser accedida y alterada bajo cualquier otro alcance de ejecucion.
var carname="Mercedes Benz";
function car() {
console.log(carname); //-> Mercedes Benz
// carname is accessible from within here
}
console.log(carname); //-> Mercedes Benz
// carname is accessible here
- Local - bajo el principio de diseño de programas, Minimo privilegio "Principle of Least Privilege". Cada modulo como proceso debe ser capaz de acceder solo a la informacion y recurso que son necesario para su legitimo proposito. Las variables definidas dentro de un bloque o funcion, estara dentro de su alcance local. Estas variables solo estan disponible dentro de su funcion o bloque en el cual son definidas. Ellas viven dentro su alcance cada vez que se llama a la funcion la cual pertenecen y solo durante su tiempo de ejecucion.
// carname is not accessible here
function car() {
var carname = 'Mercedes Benz';
//carname is accessible from within here
console.log(carname); //-> Mercedes Benz
}
// carname is not accessible here
console.log(carname); //-> ReferenceError: carname is not defined
- Funcion - bajo el alcance lexico, las variable estan restringida dentro de la misma funcion y desde afuera de la funcion no se le puede hacer referencia o no estaran disponible. Es importante entender que JavaScript no crea nueva area de alcance cuando utiliza llaves
{...}
, un nuevo alcance solo se crea mediante una nueva funcion.
// Function scope
var carname = 'Mercedes Benz';
function car(carname) {
console.log(carname);
}
// carname is not accessible here
car('BMW'); //-> BMW
console.log(carname); //-> Mercedes Benz
car('Rolls Royce'); //-> Rolls Royce
console.log(carname); //-> Mercedes Benz
car('Volvo'); //-> Volvo
- Bloque - este alcanze al contrario del funciones, es ejecutado de manera inmediata y alcanza contexto mayor que ellos, como por ejemplo globales. A esta se le incluye bloques de condiciones y bucles.
// Blocks in Javascript don't create scope
var carname="Mercedes Benz";
if(true) {
var carname = "Volvo";
console.log(carname); //-> Volvo
}
console.log(carname); //-> Volvo