Para el alcance de las variables, los idiomas como C, Java adoptan el método "Bloque de alcance". Por el contrario, JavaScript adopta el método "Alcance de la función": el alcance de la variable está determinado solo por la función en la que se encuentra y no tiene nada que ver con bloques lógicos como si y para. Por ejemplo, el siguiente ejemplo muestra los comportamientos en JavaScript que son diferentes de idiomas como C y Java:
La copia del código es la siguiente:
función(){
var s = 42; // s es visible en toda la función
if (s> 3) {
var x = "test"; // x es visible en toda la función
para (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // es visible en toda la función
}
console.log (i);
console.log (x);
}
En idiomas de "alcance de bloque" como C y Java, después de bloques lógicos, como si se completen las declaraciones y para las declaraciones, se destruirán variables definidas dentro de estos bloques lógicos. JavaScript es diferente. Mientras se define una variable dentro de una función, todos los códigos en toda la función pueden acceder a la variable, incluso si los códigos están antes de la definición de la variable:
La copia del código es la siguiente:
función(){
console.log (a); // indefinido
var a = "prueba";
console.log (a); // prueba
}
En el ejemplo anterior, si A nunca se define en la función, console.log (a) lanzará un referenceError. Cuando A se define en función, incluso si esta definición es después de la declaración de llamadas de una variable, la llamada a A es una operación legal (si la definición de una variable ocurre después de la declaración de llamada, el valor de una variable en la instrucción de llamada está indefinida). De hecho, todas las variables definidas con la palabra clave VAR en la función se elevarán al comienzo de la función (la operación de asignación permanece en la línea definida por el VAR), que se llama alusar en JavaScript. Por ejemplo, el código anterior es equivalente a:
La copia del código es la siguiente:
función(){
var a;
console.log (a); // indefinido
a = "prueba";
console.log (a); // prueba
}
Cadena de alcance de variables
Contactar al almacenamiento de variables en JavaScript puede proporcionar una buena comprensión del "alcance de la función" y la elevación de JS. Dado que las variables se almacenan en objetos globales o objetos de llamada de función, al definir una variable en una función, sin importar dónde se define la variable en la llamada de función, una propiedad con el mismo nombre que esta variable aparecerá inevitablemente en el objeto de llamada de función utilizado por esta llamada de función. Esto permite que se acceda a la variable en cualquier lugar de la función.
Cuando se trata de llamadas de funciones, hay otro concepto más interesante en JavaScript: la cadena de alcance de las variables, dado que las variables se almacenan en objetos globales o objetos de llamada de función, al acceder a las variables, puede obtener valores de múltiples objetos. El siguiente código es un ejemplo:
La copia del código es la siguiente:
var x = "prueba";
función(){
// función de nivel 1
var x = "temp";
función(){
// función de nivel-2
var x = "real";
// Intenta acceder a X aquí. X será "real".
}
}
Dentro de la función Nivel -2 en el código anterior, al intentar acceder a la variable X, el programa puede buscar los valores de atributo correspondientes de 3 objetos: el objeto de llamada de función utilizado para llamar a la función de nivel 2, el objeto de llamada de función utilizado para llamar a la función de nivel 1 y el objeto global, según la relación anidada definida por la función, Javascript generará una cadena de objeto compuesto compuesto por el objeto global y el objeto de llamada de la función. Al acceder a las variables, el programa comenzará a buscar desde el objeto más cercano a la declaración de acceso. Si no se encuentra ninguna búsqueda, continuará buscando en el objeto en el nivel anterior en la cadena de objetos hasta el objeto global.
Dado que esta cadena de objetos está relacionada con el alcance de la variable, también se llama "cadena de alcance".
Si necesita cambiar temporalmente la cadena de alcance e insertar un objeto en el extremo frontal de la cadena de alcance (como el objeto de función al que se accede primero), puede usar la instrucción con:
La copia del código es la siguiente:
con (o) {
// Código Use Propiedades del objeto o.
}
Sin embargo, en el modo JavaScript Strict, con declaraciones están deshabilitadas; Incluso en el modo no riguroso, no se recomiendan declaraciones.