2014-06-05 19 views
14

stavo vedendo un codice Javascript ed io siamo capitati qualcosa di simile:Expecting indefinito in Javascript

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

ero abbastanza sicuro che questo sarebbe uscita indefinita ma non ha? Qualcuno può dirmi perché?

+0

Solo per curiosità, qual è il punto della if' bloccare comunque ... – War10ck

+4

@pstenstrm '- C'è solo una funzione coinvolta qui, e nessuna dichiarazione al di fuori di esso. Le chiusure sono irrilevanti. – Quentin

+2

@pstenstrm Chiusura? Non c'è chiusura qui. –

risposta

14

JavaScript ha un ambito a livello di funzione, non un ambito a livello di blocco.

La dichiarazione var viene issato in modo che il codice è equivalente a:

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

Se JavaScript un margine di manovra a livello di blocco, allora ancora non sarebbe uscita undefined. Poichénon sarà dichiarato nell'istruzione alert, si attiverà un errore di riferimento.

+0

Anche questo è un errore di sintassi, in quanto è una funzione anonima non chiamata. –

+0

@IanClark Questo è oltre il punto, questo è probabilmente parte di una dichiarazione completa. –

+0

Anche se pensavo di menzionarlo perché non capivano il sollevamento/l'ambito :) –

2

Le definizioni di variabile vengono spostate nella parte superiore della funzione (sollevamento variabile); non ci sono variabili a livello di blocco.

Il compilatore cambia il codice per

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

JS non ha scopi di blocco solo funzionano \ ambiti a livello mondiale.
Nel tuo caso la variabile viene dichiarata senza valore nella parte superiore della funzione e quindi viene assegnata.

Here's un buon tutorial sugli ambiti.

+0

Esattamente, questo è il motivo. – avcajaraville

3

Il motivo per cui funziona è il risultato di ciò che viene chiamato sollevamento. Sollevamento sposta la dichiarazione della variabile in cima allo scope. Così la funzione Sembra veramente questo:.

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

"Perché dichiarazioni di variabili (e le dichiarazioni in generale) vengono elaborati prima dell'esecuzione qualsiasi codice, dichiarando una variabile in qualsiasi parte del codice è equivalente a dichiarare ai vertici Questo significa anche che una variabile può sembrare che venga utilizzata prima di essere dichiarata. Questo comportamento è chiamato "sollevamento", in quanto sembra che la dichiarazione della variabile venga spostata all'inizio della funzione o del codice globale. " - var MDN

+1

+1 Voto positivo. Questa è una risposta completa.L'ambito della funzione a livello di funzione in collaborazione con il sollevamento è il motivo principale. Ben spiegato !!! –

Problemi correlati