2013-05-28 10 views

risposta

6

L'ordine è interpretato come mostrato di seguito a causa del sollevamento variabile. Si noti che come @ShadowCreeper indica correttamente, function a(){} sta creando una variabile locale a all'interno della funzione b che viene issata come mostrato di seguito.

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 per aver menzionato 'hoisting' – sabithpocker

+0

Sta definendo' a' come funzione all'interno di 'b' costringendo' a' ad essere locale a 'b', anche senza fare esplicitamente un' var a'. Qual è la magia dietro l'ambito locale implicito? – sabithpocker

+0

+1 buon esempio – John

2

Poiché si sta creando una variabile locale (la funzione a) allora la sostituzione che il valore di variabile locale (la function) con 10.

Un modo per evitare cose come questo è precedere tutte le variabili e le funzioni locali con "_" (trattino basso).

+0

qualcosa mi dice che questo non è sufficientemente corretto. non ho fatto downvotare, per favore ... – xandercoded

+2

Se metti 'var a = 10;' all'inizio della funzione 'b', avrai una variabile locale che nasconde il globale. Credo anche che 'function a()' si comporta come 'var a = function()' (crea una variabile locale chiamata 'a' che è una' funzione'). –

+0

d'accordo, la dichiarazione locale implicita della 'funzione nidificata annidata qui è il kicker http://jsfiddle.net/AVcqr/ ... – xandercoded

2

This answer ha davvero una bella spiegazione di quello che sta succedendo qui.

Il riepilogo è che Javascript viene elaborato in due fasi, compilazione e quindi esecuzione. Le definizioni delle funzioni si verificano durante la fase di compilazione, quindi all'interno di b il compilatore vede la definizione function a() {} e la variabile locale a viene creata nell'ambito di b. Successivamente, quando il codice viene eseguito, l'ambito di b contiene già la variabile locale a prima che venga eseguito qualsiasi codice, pertanto la riga a = 10; sta semplicemente assegnando alla variabile locale un nuovo valore. La definizione della funzione è stata già elaborata durante la compilazione in modo che non si verifichi durante l'esecuzione, pertantoemetterà 10.