Sie können Variablen nicht bedingt deklarieren.
Warum?
Die Variable Instanziierung Prozess vor die eigentlichen Code-Ausführung, die zum Zeitpunkt tritt die Funktion ausgeführt wird, werden diese Variablen bereits auf dem lokalen Bereich gebunden werden, zum Beispiel:
function foo() {
if (false) {
var test = 'foo'; // never executed
}
return test;
}
foo(); // undefined
Wenn die Funktion ist Auszuführende Identifikatoren formaler Parameter, Bezeichner aus Variablendeklarationen und Bezeichner aus Funktionsdeklarationen innerhalb des Funktionskörpers sind an die lokale Variablenumgebung gebunden.
Variablen werden mit initialisiert.
Auch Identifikatoren im lokalen Bereich Schatten die andere mit dem gleichen Namen, höher im Rahmen Kette, zum Beispiel:
var test = 'global';
function bar() {
alert(test); // undefined, not "global", the local variable already declared
var test = 'xxx';
}
bar();
Wenn die test
Variable nicht überall deklariert wurden, wird ein ReferenceError
sein geworfen:
function foo() {
return test;
}
try {
foo(); // ReferenceError!!
} catch (e) {
alert(e);
}
das über einer der Gründe ist, warum zum Beispiel empfiehlt JSLint nur one var
statement an der Spitze der Funktionen, weil zum Beispiel t er erste Schnipsel, wird dies tatsächlich ähneln, wenn sie ausgeführt:
function foo() {
var test; // var statement was "hoisted"
if (false) {
test = 'foo'; // never executed
}
return test;
}
foo(); // undefined
Ein weiterer Grund ist, weil Blöcke keinen neuen lexikalischen Gültigkeitsbereich einzuführen, funktioniert nur tun es, so eine var
Aussage innerhalb eines Hinschauen könnte man denken, dass Die Lebensdauer der Variablen ist nur auf diesen Block beschränkt, aber das ist nicht der Fall.
Verschachtelte Funktionsdeklarationen ein ähnliches Verhalten von hoisting haben, werden sie vor die Ausführung von Code deklariert werden, aber sie sind auch in diesem Moment initialisiert:
function foo() {
return typeof bar;
// unreachable code:
function bar() {
//..
}
}
foo(); // "function"
Benchmark es, http: // jsperf. com/undefined-Variablen –