2013-03-01 9 views
5

Ciao Sono nuovo di Javascript, e sto leggendo il Javascript di Oreilly la guida definitiva. Nella sezione istruzione di dichiarazione che dice:La dichiarazione della funzione non deve apparire all'interno dell'istruzione condizionale?

enter image description here

Ho fatto un semplice test:

var a = 1; 
while(a < 5){ 
    a++; 
    function double(a){return a * 2 }; 
    console.log(double(a)); 
}  

Sembra che i node.js non mi dà alcun errore ed eseguire come si aspettano. Qualche commento su questo?

+2

Eseguilo in modalità rigorosa e otterrai il tuo errore. È una sintassi non valida * (eccetto se l'implementazione di JS di Mozilla in cui è consentita una sintassi simile) *, ma è stata storicamente autorizzata dalle implementazioni. –

risposta

-1

Non è vero. Tuttavia, dovresti tenere presente che potrebbero non comportarsi come potresti aspettarti.

Per esempio, questo funzionerà:

if(false) { 
    function double(a) {return a*2;}; 
} 
else { 
    console.log(double(4)); 
} 

Anche se si potrebbe pensare che la funzione non viene mai definita a causa di essere all'interno di un if che non viene mai raggiunto, la funzione è infatti issato in cima alla attuale "blocco" (sia esso una funzione di contenimento o l'intero tag <script> o file) e sono quindi accessibili ovunque.

È non dovrebbe mettere function definizioni all'interno di un blocco di if, ma non c'è motivo per cui non è possibile.

+1

ci sono molte ragioni per cui non dovresti: 1. le specifiche dicono di no, 2. su alcuni browser, non funziona! – Alnitak

+0

@Alnitak Ho detto in particolare che non dovresti. Tuttavia, secondo le specifiche sul sollevamento, è esattamente lo stesso di 'var'. –

+0

Non è valido in base alle specifiche, quindi ciò che la specifica descrive su "sollevamento" * (un termine non utilizzato nelle specifiche) * non si applica. Le implementazioni possono consentirlo e possono trattarne lo stesso sollevamento, ma non è ancora valido. –

Problemi correlati