2013-05-28 6 views

Antwort

6

Die Reihenfolge wird aufgrund des variablen Hubs wie folgt interpretiert. Beachten Sie, dass, wie @ShadowCreeper korrekt angibt, function a(){} tatsächlich eine lokale Variable a innerhalb der Funktion b erstellt, die wie unten gezeigt gehisst wird.

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1 für die Erwähnung von 'hosting' – sabithpocker

+0

Definiert' a' als Funktion innerhalb von 'b', wobei 'a' lokal zu' b' ist, auch ohne explizit eine 'var a' zu machen. Was ist die Magie hinter dem impliziten lokalen Geltungsbereich? – sabithpocker

+0

+1 gutes Beispiel – John

2

Weil Sie eine lokale Variable (die Funktion a) Erstellen dann ersetzt, dass die lokale Variablenwert (die function) mit 10.

Eine Möglichkeit, solche Dinge zu vermeiden, besteht darin, allen lokalen Variablen und Funktionen mit "_" (Unterstrich) voranzukommen.

+0

etwas sagt mir, das ist nicht ausreichend korrekt. Ich habe nicht downvote, fwiw ... – xandercoded

+2

Wenn Sie 'var a = 10;' an der Spitze der 'b'-Funktion setzen, haben Sie eine lokale Variable, die die globale versteckt. Ich glaube auch, dass 'function a()' sich genauso verhält wie 'var a = function()' (erzeugt eine lokale Variable namens 'a', die eine' function' ist). –

+0

einverstanden, die implizite lokale Deklaration der verschachtelten 'Funktion a' hier ist der Kicker http://jsfiddle.net/AVcqr/ ... – xandercoded

2

This answer hat eine wirklich schöne Erklärung dessen, was hier vor sich geht.

Die Zusammenfassung ist, dass Javascript in zwei Phasen, Kompilierung und dann Ausführung verarbeitet wird. Die Funktionsdefinitionen treten während des Kompilierungsschritts auf, so dass der Compiler innerhalb von b die Definition function a() {} sieht und die lokale Variable a im Rahmen von b erstellt wird. Später, wenn der Code ausgeführt wird, enthält der Gültigkeitsbereich von b bereits die lokale Variable a, bevor ein Code ausgeführt wird, so dass die Zeile a = 10; der lokalen Variablen nur einen neuen Wert gibt. Die Funktionsdefinition wurde bereits während der Kompilierung verarbeitet, so dass sie während der Ausführung nicht auftritt. Daher gibt console.log(a)10 aus.