JavaScript hace un par de cosas que no son, obviamente, intuitiva - el que usted está interesado en que se denomina "elevación" - JS mueve declaraciones var a la parte superior de una función, donde sirven el único propósito de reservar este nombre de variable como una variable local en el alcance de la función. A veces, esto lleva a lots of weirdness. Si el nombre de la variable ya está reservado como una variable local (por ejemplo, es un argumento), la declaración var se descarta por completo.
Otra parte no intuitiva de JS es cómo se trata con las variables de argumento y el objeto arguments
(que son un poco especiales, como mostró Hippo). Sin embargo, eso no es necesariamente lo que le interesa, lo que es importante para su ejemplo es que los argumentos también declaran ese nombre de variable como local para la función.
El resultado de todo esto es que cuando se tiene un var f
, así como un nombre de argumento f
, el `var f' se cae, y su ejemplo es equivalente a:
function Foo(f) {
f = f;
}
Esto se puede ver en el ejemplo de Hipona, porque:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
es equivalente a:
function foo(f) {
var f;
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
es equivalente a:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Para más detalles, leer la sección 10.1.3 - instanciación variable (parte inferior de la página 37) en ECMA-262, la especificación JS.
¿Y cuál es la pregunta? –
La pregunta está implícita: cómo se resuelve el nombre de la ambigüedad o cómo se hace referencia a cada una de las dos variables "f" distintas más adelante en el método. –