2014-06-05 3 views
14

Ich sah einige Javascript-Code und ich stolperte über etwas wie folgt undefined:Expecting in Javascript

function() { 
    if(true) { 
     var a = 5; 
    } 
    alert(a); 
} 

ich ziemlich sicher war, dies würde die Ausgabe nicht definiert, aber es nicht? Kann mir jemand sagen warum?

+0

Einfach nur neugierig, was ist der Sinn des 'if' sowieso blockieren ... – War10ck

+4

@pstenstrm - Es gibt nur eine Funktion hier beteiligt sind, und es werden keine Aussagen außerhalb. Verschlüsse sind irrelevant. – Quentin

+2

@pstenstrm Verschluss? Es gibt hier keine Schließung. –

Antwort

14

JavaScript hat einen Funktionslevelbereich, nicht einen Blocklevelbereich.

Die var Aussage gehisst wird, so ist der Code entspricht:

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 

Wenn JavaScript Blockebene Umfang hätte, dann wäre es immer noch nicht ausgegeben undefined. Da a in der alert-Anweisung nicht deklariert wäre, würden Sie einen Referenzfehler auslösen.

+0

Auch dies ist ein Syntaxfehler, da es eine anonyme Funktion nicht aufgerufen wird. –

+0

@IanClark Das ist neben dem Punkt, dies ist wahrscheinlich Teil einer vollständigen Aussage. –

+0

Obwohl ich dachte, ich würde erwähnen, da sie Hubs/Scoping nicht verstanden haben :) –

2

Variablendefinitionen werden an den Anfang der Funktion verschoben (variable Hubfunktion); Es gibt keine Variablen auf Blockebene.

Der Compiler ändert Ihren Code

function() { 
    var a; 
    if(true) { 
     a = 5; 
    } 
    alert(a); 
} 
2

JS nicht über Block Bereiche funktionieren nur \ global Bereiche.
In Ihrem Fall wird die Variable ohne Wert am Anfang der Funktion deklariert und dann zugewiesen.

Here's ein gutes Tutorial über Bereiche.

+0

Genau, deshalb. – avcajaraville

3

Der Grund, warum dies funktioniert, ist eine Folge dessen, was man als Hochziehen bezeichnet. Das Hochziehen verschiebt die Deklaration der Variablen an die Spitze des Bereichs. So Ihre Funktion sieht wirklich so aus:.

function() { 
var a; 
if(true) { 
    a = 5; 
} 
alert(a); 
} 

„Da Variablendeklarationen (und Erklärungen im Allgemeinen) verarbeitet werden, bevor ein Code ausgeführt wird, an jedem Ort der Deklaration eine Variablen im Code entspricht es an der Spitze zu erklären Diese bedeutet auch, dass eine Variable scheinbar vor der Deklaration verwendet wird. Dieses Verhalten wird als "Hochziehen" bezeichnet, da die Variablendeklaration scheinbar an den Anfang der Funktion oder des globalen Codes verschoben wird. " - var MDN

+1

+1 Upvote. Dies ist eine vollständige Antwort.Das Hauptaugenmerk liegt auf dem Scope auf Funktionsebene in Verbindung mit dem Hochziehen. Gut erklärt !!! –

Verwandte Themen