Ich habe gehört, dass der Zugriff let
und die const
Werte vor der Initialisierung ReferenceError
aufgrund der sogenannten zeitlichen Totzone eine Ursache sein können .
Was ist die zeitliche Totzone, in welcher Beziehung steht sie zu Umfang und Heben und in welchen Situationen ist sie anzutreffen?
javascript
ecmascript-6
const
let
Joews
quelle
quelle
Antworten:
let
undconst
haben zwei große Unterschiede vonvar
:var
bevor es deklariert wird, hat das Ergebnisundefined
; Zugriff auf einlet
oderconst
bevor es deklariert wird wirftReferenceError
:Aus diesen Beispielen geht hervor, dass
let
Deklarationen (undconst
, die auf die gleiche Weise funktionieren) möglicherweise nicht gehisst werden , daaLet
sie nicht zu existieren scheinen, bevor ihr ein Wert zugewiesen wurde.Das ist nicht der Fall, however-
let
undconst
sind hochgezogen (wievar
,class
undfunction
), aber es ist eine Zeit zwischen der Eingabe und Umfang erklärt wird , wo sie nicht zugegriffen werden kann. Diese Periode ist die zeitliche Totzone (TDZ) .Die TDZ endet , wenn
aLet
wird erklärt , anstatt zugeordnet :Dieses Beispiel zeigt, dass
let
gehisst wird:Gutschrift: Temporal Dead Zone (TDZ) entmystifiziert
Der Zugriff
x
im inneren Bereich verursacht weiterhin aReferenceError
. Wennlet
es nicht gehisst würde, würde es sich protokollierenouter value
.Die TDZ ist eine gute Sache, da sie dazu beiträgt, Fehler hervorzuheben. Der Zugriff auf einen Wert, bevor er deklariert wurde, ist selten beabsichtigt.
Die TDZ gilt auch für Standardfunktionsargumente. Argumente werden von links nach rechts ausgewertet, und jedes Argument befindet sich in der TDZ, bis es zugewiesen wird:
Die TDZ ist im Transpiler babel.js standardmäßig nicht aktiviert . Aktivieren Sie den "High Compliance" -Modus, um ihn in der REPL zu verwenden . Geben Sie das
es6.spec.blockScoping
Flag an, um es mit der CLI oder als Bibliothek zu verwenden.Empfohlene weitere Lektüre: TDZ entmystifiziert und ES6 Let, Const und die „Temporal Dead Zone“ (TDZ) im Detail .
quelle
let foo
in einem Block bewirkt, dass er oben in diesem Block angehoben und deklariert wird. Die Zeilelet foo
bewirkt, dass es initialisiert wird. Undfoo = xyz
bewirkt, dass ihm ein Wert zugewiesen wird.Hissen:
let
,const
,var
sind alle get gehisst Prozess.(Was bedeutet, dass sie nach oben gehen und oben im Bereich deklarieren.)
Initialisierung:
var
Gehen Sie auch durch den Anfangsprozess und erhalten Sie den Anfangswert vonundefined
.let
,const
ging nicht den ersten Prozess werfen, so dass ihre Werte immer noch nicht zugänglich sind, obwohl sie bereits erklärt. Was hat sie reingelegt?temporal dead zone
Also in Kürze:
quelle
Im Fall von let- und const-Variablen ist die zeitliche Totzone grundsätzlich eine Zone
"bevor Ihre Variable deklariert wird",
Wenn Sie also nicht auf den Wert dieser Variablen zugreifen können, wird ein Fehler ausgegeben.
Ex.
Der obige Code gibt einen Fehler aus
Der gleiche Code gibt keinen Fehler aus, wenn wir var für die Variable 'a' verwenden.
Ex.
quelle
undefined
und5
). Die Deklaration vonvar a
wird gehisst, dera
auf 5 eingestellte Inifialisierungscode nicht.