1. Las variables locales se utilizan primero y luego se declaran, lo que no afecta a las variables externas con el mismo nombre.
Copie el código de código de la siguiente manera:
var x = 1; // --> variable externa x
función fn(){
alert(x); // --> la variable local indefinida x se usa primero
var x = 2; // declarar y asignar más tarde
}
fn();
alerta(x); // --> 1<BR>
El primer punto es que la primera oración en la función fn genera x, y x se define en la segunda oración. Esto está permitido en JS y permitido aquí significa que el programa puede ejecutarse sin errores de sintaxis.
Pero no está permitido en otros lenguajes como C y Java. Las variables deben declararse antes de su uso, como
Copie el código de código de la siguiente manera:
Prueba de clase pública {
público estático vacío principal (String [] argumentos) {
System.out.println(x); //Usar primero
int x = 10; // Publicar declaración
}
}
En Java, el compilador generará un error y el programa no podrá ejecutarse.
El segundo punto es que la variable local x dentro de la función fn no afectará a la variable externa x. Es decir, la salida de alerta en fn no es 1, sino indefinida.
En segundo lugar, los parámetros formales tienen mayor prioridad que los nombres de funciones.
Copie el código de código de la siguiente manera:
función fn(fn){
alerta(función);
}
fn('hola'); // --> "hola"
Puede ver que el nombre de la función y el parámetro formal tienen el mismo nombre que fn, y la salida es la cadena "hola", pero no el cuerpo de la función (fn.toString()) de la función fn.
En tercer lugar, los parámetros formales tienen mayor prioridad que los argumentos.
Copie el código de código de la siguiente manera:
función fn(argumentos){
alerta(argumentos);
}
fn('hola'); // --> "hola"<BR>
El objeto de argumentos se puede utilizar directamente dentro de la función y es un identificador especial proporcionado por el propio lenguaje.
Aquí sucede que el parámetro formal se declara con el mismo nombre. Puede ver que la salida es "hola" en lugar de "[objeto Objeto]", es decir, los argumentos de los parámetros formales cubren los argumentos reales proporcionados por el propio lenguaje.
4. Los parámetros formales tienen mayor prioridad que las variables locales que se declaran pero no se asignan.
Copie el código de código de la siguiente manera:
función fn(a){
var a;
alerta(a);
}
fn('hola'); // --> "hola"
El parámetro formal de la función fn es a. La primera oración de la función solo declara la variable local a, pero no asigna un valor. Del hecho de que el resultado de salida es "hola" en lugar de indefinido, se puede ver que el parámetro formal a tiene una prioridad más alta que la variable local a que solo se declara pero no se le asigna un valor.
5. Las variables locales declaradas y asignadas tienen mayor prioridad que los parámetros formales.
Copie el código de código de la siguiente manera:
función fn(a){
var a = 1;
alerta(a);
}
fn('hola'); // --> "1"
El parámetro formal de la función fn es a. La primera oración de la función solo declara la variable local a y le asigna un valor de 1. Del resultado de salida es "1" en lugar de "hola", podemos ver que la variable local a declarada y asignada tiene una prioridad más alta que el parámetro formal a.
6. Cuando se asignan parámetros formales a variables locales con el mismo nombre
Copie el código de código de la siguiente manera:
función fn(a){
var a = a;
alerta(a);
}
fn('hola');
No lo ejecutes todavía, adivina el resultado. Si sigue el punto 5: las variables locales declaradas y asignadas tienen mayor prioridad que los parámetros formales. Entonces a será indefinido. Pero, de hecho, a es "hola", es decir, la a derecha es el parámetro formal a y la a izquierda es la variable local a.
Las dos a aquí no interfieren entre sí y ninguna cubre a la otra. Esto es contradictorio con lo que acabo de decir: las variables locales asignadas tienen mayor prioridad que los parámetros formales. Pero el motor hace lo que queremos, porque no queremos que a quede indefinido después de var a = a.