6
if(true) { 
    let m = "yo"; 

    console.log(m); 
} 

console.log(m) 

uscita:Ordine di esecuzione JavaScript: perché questo condizionale viene eseguito dopo il codice che lo segue?

ReferenceError: m is not defined 
yo 

Quindi il codice sulla linea 4 è essere eseguita dopo il codice on line 8.

il mio utilizzo di let hanno nulla a che fare con questo?

EDIT: Dopo aver letto i commenti mi sono reso conto che ciò potrebbe essere dovuto al mio runtime. Ecco come la vedo io in Firefox nightly:

firefox nightly let m

EDIT 2: Se questo è davvero solo il mio tempo di esecuzione, poi ci sono implicazioni per il codice di produzione a causa di qualcosa di simile? Comportamento incoerente attraverso i browser? Come posso proteggerlo?

+0

Stai eseguendo questo in Chrome? – Ben

+1

[Non riesco a riprodurre quello.] (Http://jsfiddle.net/nxzt5npp/) - e sto visualizzando questo in edizione FF dev. – Andy

+0

Ho questo comportamento in Firefox Nightly, console. –

risposta

2

Quindi penso che il comportamento del runtime FF sia OK. Una rapida occhiata alla specifica (6.2.3.1 ecc.) Indica che il codice deve essere eseguito riga per riga, fino al secondo console.log(m) a cui viene lanciata una ReferenceError.

Sospetto solo che "sembri divertente" a causa dell'ordine in cui la console sceglie di eseguire il primo console.log e il messaggio di eccezione (è l'inverso di Chrome per esempio).

Se l'ordine di rendering per la console è considerato un bug o no, lascio agli altri.

Quanto segue sembra confermare la mia analisi con l'avviso che mostra prima che l'eccezione venga registrata.

if(true) { 
    let m = "yo"; 

    alert(m); 
} 

console.log(m) 
+0

Puoi confermare che si tratta di un bug? Non ho la consapevolezza di dedurre quello che stai dicendo [in realtà sto trovando difficile da comprendere :-)]. Forse dovrei presentare un rapporto? –

+0

Dovrò controllare gli errori di riferimento delle spec ref – Ben

+2

@adityamenon Lanciare l'errore di riferimento * in anticipo * e non eseguire 'if' e' console.log' in generale * sarebbe * un bug. Il codice sembra funzionare bene, che il log viene stampato dopo che l'errore è confuso ma potrebbe essere coperto dall'implementazione dell'oggetto 'console'. Sì, dovresti inserire un bug perché questo comportamento è abbastanza inaspettato, ma non con la compatibilità ES6, ma piuttosto con il componente devtools. (E dopo averlo fatto, per favore collegalo qui) – Bergi

Problemi correlati