No puede declarar las variables de forma condicional.
¿Por qué?
El proceso de instanciación variable aparece antes la ejecución de código real, en el momento en que se ejecuta la función, esas variables se ya vinculado al ámbito local, por ejemplo:
function foo() {
if (false) {
var test = 'foo'; // never executed
}
return test;
}
foo(); // undefined
cuando la función se a punto de ser ejecutado, los identificadores de los parámetros formales, los identificadores de las declaraciones de variables y los identificadores de las declaraciones de funciones dentro del cuerpo de la función están vinculados al entorno de variables locales.
Las variables se inicializan con undefined
.
También, identificadores en el local de alcance sombra los otros con el mismo nombre, superior en la cadena de ámbito, por ejemplo:
var test = 'global';
function bar() {
alert(test); // undefined, not "global", the local variable already declared
var test = 'xxx';
}
bar();
Si la variable test
no fueron declarados en cualquier lugar, un ReferenceError
serán tirado:
function foo() {
return test;
}
try {
foo(); // ReferenceError!!
} catch (e) {
alert(e);
}
Esa es una de las razones de por qué, por ejemplo, sólo se recomienda JSLint one var
statement en la parte superior de las funciones, porque por ejemplo, t él primer fragmento, en realidad se parecen a esto cuando es ejecutado:
function foo() {
var test; // var statement was "hoisted"
if (false) {
test = 'foo'; // never executed
}
return test;
}
foo(); // undefined
Otra razón es porque los bloques no introducen un nuevo ámbito léxico, sólo funciona lo hacen, por lo que tener una declaración var
dentro de un aspecto que podría hacer pensar que la vida de la variable está restringida a ese bloque solamente, pero ese no es el caso.
declaraciones de funciones anidadas tendrán un comportamiento similar de hoisting, que se declararán antes de la ejecución de código, pero se inicializan en ese momento también:
function foo() {
return typeof bar;
// unreachable code:
function bar() {
//..
}
}
foo(); // "function"
comparativas que, http: // jsperf. com/undefined-variables –