2015-12-11 14 views
5

Ho cercato di eseguire il codice qui sotto in Firefox V30.0 Scratchpad:ReferenceError non sta gettando quando si accede a 'lasciare' variabile prima dichiarazione

function do_something() { 
    console.log(foo); // ReferenceError 
    let foo = 2; 
} 
do_something(); 

Il comportamento previsto è che il mio programma dovrebbe buttare errore di riferimento, perché Sto accedendo a una variabile let prima della sua dichiarazione. Ma, io non sto ottenendo il comportamento previsto, il programma ha ottenuto eseguita e il risultato è il seguente

undefined 

si può spiegare a me, perché è comportando così?

+0

Per quanto ne so, le variabili dichiarate "let' sono ancora state issate, come' var', solo nella parte superiore del blocco, non nella funzione. –

+0

@JamesThorpe - Le dichiarazioni vengono issate, ma a causa della zona morta temporale qualsiasi tentativo di fare riferimento a esse prima dell'inizializzazione deve essere eseguito. –

+0

è possibile eseguire il codice in "modalità rigorosa" e vedere se qualcosa cambia, a mio parere il risultato atteso è quello di tirare ... il sollevamento variabile dovrebbe avvenire solo se si utilizza la parola chiave var ... – Hitmands

risposta

6

In base allo MDN compatibility table, Firefox supporta la semantica della zona morta solo dalla v35.

Inoltre, assicurarsi sempre di utilizzare la modalità rigorosa. Alcune funzionalità di ES6 non sono disponibili in modalità sciatta, a causa delle preoccupazioni relative alla rottura del Web legacy. Tuttavia, non dovrebbe influenzare questo caso specifico, nonostante la lunga storia di Firefox dell'uso di let.

4

Consenti alle variabili in ES6 di essere sollevate nella parte superiore del blocco in cui sono dichiarate. Il riferimento della variabile prima della sua dichiarazione genererà un ReferenceError (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let). Pertanto, è corretto aspettarsi un errore ReferenceError in questo caso.

Il motivo per cui l'errore ReferenceError non sta accadendo in questo caso è perché FF 30 non supporta la cosiddetta "zona morta temporanea". Un buon posto per scoprire se i browser supportano parti specifiche delle specifiche ES6 è la tabella di compatibilità di Ecmascripts di Kangax (https://kangax.github.io/compat-table/es6/#test-let).