2016-09-08 3 views
0

warum loggt die foo() - Funktion undefined? Die erste text Variable ist eine globale Variable, daher sollte foo() Zugriff darauf haben.JavaScript histing und scope

var text = "outside"; 

function foo() { 
    console.log(text); 
    var text = "inside"; 
} 

foo(); 
+0

Geben Sie Text zurück; und alert (foo()) –

+2

@Jonasw nicht 'alert' für Debugging-Anweisungen verwenden. –

Antwort

4

Auch wenn die var Anweisung nach der console.log() Aussage ist, wird die Erklärung zu Beginn der Funktion gehisst. Dies deklariert eine lokale Variable, die die globale Variable schattiert. Aber die Initialisierung geschieht nicht, bis Sie tatsächlich zu der Anweisung gelangen, die nach der console.log()-Anweisung ist.

So Ihre Funktion ist äquivalent zu:

function foo() { 
    var text; 
    console.log(text); 
    text = 'inside'; 
} 

Wenn Sie nicht die var Erklärung verwendet haben dann würden Sie auch weiterhin die globale Variable verwenden, und die Neuzuordnung würde erst nach dem console.log() passieren.

+0

Ich denke, es ist erwähnenswert, dass JavaScript nicht tatsächlich hissen. Dieses Verhalten ist tatsächlich das Ergebnis des ersten Durchlaufs des Kompilierungsvorgangs. Das resultierende Verhalten ist das gleiche wie das Hochziehen, technisch gesehen wird jedoch nichts wirklich hochgezogen. – mhodges

+0

@Barmar Beachten Sie, dass die Variable var aus der Funktion foo() entfernt wird, um foo die globale Variable text zu verwenden. – Feathercrown

+1

@mhodges Was ist der effektive Unterschied zwischen diesem und dem Hochziehen? – Barmar