2016-04-15 16 views
9

Vedi questo codice:Prendere diamo variabile da zona morta temporale

<script> 
 
let {foo} = null; // TypeError 
 
</script> 
 
<script> 
 
// Here I want to assign some some value to foo 
 
</script>

Il primo script cerca di far dichiarare-foo tramite l'assegnazione di destrutturazione. Tuttavia, null non può essere destrutturato, quindi l'assegnazione genera un errore TypeError.

Il problema è che poi la variabile foo viene dichiarata ma non inizializzata, quindi se nel 2 ° script che tenta di fare riferimento foo, getta:

foo = 123; // ReferenceError: can't access lexical declaration `foo' before initialization 

E let variabili non può essere dichiarato nuovamente:

let foo = 123; // SyntaxError: redeclaration of let foo 

C'è un modo per estrarlo dal TDZ, in modo che possa assegnare valori e leggerli?

+0

BTW, voglio usare 'pippo', non soluzioni come' window.foo'. – Oriol

+0

Immagino che ci sia qualcosa di interessante nel primo script che rende difficile la validità dell'inizializzazione. – Pointy

+0

@Oriol: 'window.foo' [non funzionerebbe comunque] (http://stackoverflow.com/q/28776079/1048572) :-) – Bergi

risposta

2

È impossibile. Ci si aspetta che la zona morta temporale e l'accesso limitato alla variabile non inizializzata let non siano consentiti. È confuso e problematico, ma previsto e previsto.

Vedi spec per i dettagli:

NOTA lasciate e le dichiarazioni const definire le variabili che hanno come ambito per LexicalEnvironment del contesto di esecuzione in esecuzione. Le variabili vengono create quando il loro ambiente Lexical contenente è istanziato, ma non è possibile accedervi in ​​alcun modo finché la variabile LexicalBinding non viene valutata. Una variabile definita da un LexicalBinding con un inizializzatore viene assegnata al valore di AssignmentExpression del suo inizializzatore quando viene valutato il LexicalBinding, non quando viene creata la variabile. Se un LexicalBinding in una dichiarazione let non ha un Initializer la variabile viene assegnato il valore indefinito quando il LexicalBinding viene valutato. \

Quindi, se la variabile non è stato inizializzato su dichiarazione (e lanciando prima dell'inizializzazione, ovviamente, comporterà alcuna inizializzazione) non è accessibile con nessun mezzo.

Ma in realtà, il problema è più complesso del lancio dell'assistenza. È un problema di architettura - tu stai dipendendo da variabili globali mutabili. È grande "no no no" e dovresti rifattorizzare il tuo codice per utilizzare dipendenze esplicite.

Problemi correlati