2010-12-10 18 views
0

zuweisen Kann jemand diesen (Code in globalen Bereich) erklärenJavascript globale Variablen themself

var a = a || 4 // a exists & is 4 
window.a = window.a || 4 // a exists & is 4 
window.a = a || 4 // a is undefined error 
a = a || 4 // a is undefined error 

eine Erklärung, was der Unterschied zwischen diesen vier Aufgaben ist und warum einige handhaben es richtig, aber andere nicht.

[Bearbeiten] Dieses spezielle Beispiel wurde auf der V8 Chrome-Konsole getestet.

Antwort

4
var a = a || 4 // var a is evaluated at compile time, so a is undefined here 
window.a = window.a || 4 // window.a is simply undefined 
window.a = a || 4 // no var a, therefore the variable doesn't exist, = reference error 
a = a || 4 // again, no var, reference error 

Die var Anweisung deklariert die Variable/Funktion in der Nähe Einkapseln Umfang und setzt es auf undefined. Wenn es nicht var gibt, wird überhaupt keine Variable/Funktion deklariert. Daher der Referenzfehler.

Einige Beispiele.

function Aussage:

foo(); // works 
function foo() {} 

bar(); // TypeError: undefined is not a function 
var bar = function(){}; 

var Aussage:

function test(foo) {   
    if (foo) { 
     var bar = 0; // defined at compile time in the scope of function test 
    } else { 
     bar = 4; // sets the bar above, not the global bar 
    } 
    return bar; 
} 

console.log(test(false)); // 4 
console.log(bar); // ReferenceError 
+0

Natürlich hier die Differenz auf ein Objekt eine nicht definierte Eigenschaft ist und ein nicht angemeldetes Objekt. Warum ist ein Undefined zur Kompilierzeit aber zur Laufzeit nicht deklariert? – Raynos

+0

Die Anweisung 'var' deklariert die Variable im nächstgelegenen Kapselungsbereich und setzt sie auf 'undefiniert'. Wenn es nicht 'var' gibt, wird überhaupt keine Variable deklariert. Daher der Referenzfehler. –

+0

Nice one Ich wusste nicht, ein 'var bar = 0' wurde zur Kompilierzeit im Funktionsumfang definiert. Deshalb brauche ich nur eine "var" -Anweisung statt zwei – Raynos