J'ai entendu dire que l'accès let
et les const
valeurs avant leur initialisation peuvent provoquer une ReferenceError
cause de quelque chose appelé la zone morte temporelle .
Qu'est-ce que la zone morte temporelle, comment se rapporte-t-elle à la portée et au levage, et dans quelles situations est-elle rencontrée?
javascript
ecmascript-6
const
let
joews
la source
la source
Réponses:
let
etconst
ont deux grandes différences devar
:var
avant qu'il ne soit déclaré a le résultatundefined
; accéder à unlet
ouconst
avant qu'il ne soit déclaré lanceReferenceError
:Il ressort de ces exemples que les
let
déclarations (etconst
, qui fonctionne de la même manière) ne peuvent pas être hissées , caraLet
ne semble pas exister avant qu'on lui attribue une valeur.Ce n'est pas le cas, cependant -
let
etconst
sont hissés (commevar
,class
etfunction
), mais il y a une période entre l'entrée dans le champ d'application et la déclaration où ils ne sont pas accessibles. Cette période est la zone morte temporelle (TDZ) .Le TDZ se termine quand
aLet
est déclarée , plutôt que attribué :Cet exemple montre qu'il
let
est hissé:Crédit: Temporal Dead Zone (TDZ) démystifié
L'accès
x
dans la portée interne provoque toujours unReferenceError
. S'illet
n'était pas hissé, il se connecteraitouter value
.Le TDZ est une bonne chose car il permet de mettre en évidence les bogues - accéder à une valeur avant qu'elle n'ait été déclarée est rarement intentionnel.
Le TDZ s'applique également aux arguments de fonction par défaut. Les arguments sont évalués de gauche à droite, et chaque argument est dans la TDZ jusqu'à ce qu'il soit affecté:
Le TDZ n'est pas activé par défaut dans le transpilateur babel.js . Activez le mode «haute conformité» pour l'utiliser dans le REPL . Fournissez l'
es6.spec.blockScoping
indicateur pour l'utiliser avec l'interface de ligne de commande ou comme bibliothèque.Lectures complémentaires recommandées: TDZ démystifié et ES6 Let, Const et la «zone morte temporelle» (TDZ) en profondeur .
la source
let foo
dans un bloc fait qu'il soit hissé et déclaré en haut de ce bloc. La ligne delet foo
provoque son initialisation. Etfoo = xyz
lui attribue une valeur.Hissage:
let
,const
,var
sont tous Tracez votre processus hissés.(ce qui veut dire qu'ils vont plus haut et déclarent en haut de la portée.)
Initialisation:
var
passez également par le processus initial et obtenez la valeur initiale deundefined
.let
,const
ne sont pas allés lancer le processus initial, de sorte que leurs valeurs sont toujours inaccessibles, bien qu'elles aient déjà été déclarées. dans quoi les mettretemporal dead zone
Donc en bref:
la source
En cas de variables let et const, Fondamentalement, la zone morte temporelle est une zone
"avant que votre variable ne soit déclarée",
c'est à dire là où vous ne pouvez pas accéder à la valeur de ces variables, cela lancera une erreur.
ex.
le code ci-dessus donne une erreur
le même code ne donnera pas d'erreur lorsque nous utilisons var pour la variable 'a',
ex.
la source
undefined
et5
). La déclaration devar a
est hissée, le code d'inifialisation misa
à 5 ne l'est pas.