2016-04-15 7 views
9

diesen Code Siehe:Nimm Variable lassen aus zeitlichen Totzonen

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

Das erste Skript versucht foo über eine Destrukturierung Zuordnung lassen zu deklarieren. null kann jedoch nicht destrukturiert werden, daher löst die Zuweisung einen TypeError aus.

Das Problem ist, dass dann die foo Variable deklariert, aber nicht initialisiert, so dass, wenn in dem zweiten Skript Ich versuche foo zu verweisen, es wirft:

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

Und let Variablen können nicht neu deklariert werden:

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

gibt es eine Möglichkeit, es aus dem TDZ zu nehmen, so dass ich Werte zuweisen und sie lesen?

+0

BTW, ich will 'foo' verwenden, nicht Abhilfen wie 'window.foo'. – Oriol

+0

Ich vermute, dass es etwas Interessantes am ersten Skript gibt, das die Gültigkeit der Initialisierung schwierig macht. – Pointy

+0

@Oriol: 'window.foo' [würde sowieso nicht funktionieren] (http://stackoverflow.com/q/28776079/1048572) :-) – Bergi

Antwort

2

Es ist unmöglich. Es wird erwartet, dass eine zeitweilige Totzone und ein eingeschränkter Zugang zu einer nicht initialisierten let Variablen unvermeidlich sind. Es ist verwirrend und problematisch, aber beabsichtigt und erwartet.

Siehe spec für Details:

HINWEIS lassen und const Deklarationen definieren Variablen, die auf die laufenden Ausführungskontext des LexicalEnvironment scoped sind. Die Variablen werden erstellt, wenn ihr Lexical-Environment instanziiert wird, aber auf keinen Fall zugegriffen werden kann, bis die Variable LexicalBinding ausgewertet wird. Eine Variable, die durch ein LexicalBinding mit einem Initialisierer definiert wird, erhält den Wert der Zuweisungsausdruck des Initializers, wenn LexicalBinding ausgewertet wird, nicht wenn die Variable erstellt wird. Wenn ein LexicalBinding in einer let Deklaration der Variablen zugewiesen werden, um den Wert undefiniert keine Initializer hat, wenn der LexicalBinding ausgewertet wird. \

Also, wenn Variable nicht auf Deklaration initialisiert wurde (und wirft vor der Initialisierung führt offensichtlich in keinem Initialisierung) kann auf keinen Fall zugegriffen werden.

Aber in der Tat ist das Problem komplexer als assigment werfen. Es ist Architekturproblem - Sie sind abhängig von veränderbaren globalen Variablen. Es ist groß "Nein, nein, nein" und Sie sollten Ihren Code so umgestalten, dass explizite Abhängigkeiten verwendet werden.

Verwandte Themen