Maison >interface Web >js tutoriel >Introduction détaillée au concept de « zone morte temporaire » en JS
Zone morte temporaire
Tant que la commande let
existe dans la portée au niveau du bloc, les variables qu'elle déclare seront "liées" à cette zone et ne seront plus être affecté par une influence extérieure.
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
Dans le code ci-dessus, il y a une variable globale tmp
, mais let
déclare une variable locale tmp
dans la portée au niveau du bloc, obligeant cette dernière à lier ce niveau du bloc scope, donc avant que let
déclare une variable, attribuer une valeur à tmp
entraînera une erreur.
ES6 stipule clairement que s'il y a des commandes let
et const
dans un bloc, les variables déclarées par ces commandes dans ce bloc formeront dès le début une portée fermée. Toute utilisation de ces variables avant déclaration entraînera une erreur.
En bref, au sein du bloc de code, la variable n'est disponible que lorsqu'elle est déclarée à l'aide de la commande let
. Grammaticalement, cela s'appelle la « zone morte temporaire » (TDZ).
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
Dans le code ci-dessus, avant que la commande let
déclare la variable tmp
, elle appartient à la "zone morte" de la variable tmp
.
"Zone morte temporaire" signifie également que typeof
n'est plus une opération sûre à 100%.
typeof x; // ReferenceError let x;
Dans le code ci-dessus, la variable x
est déclarée à l'aide de la commande let
, donc avant d'être déclarée, elle appartient à la "zone morte" de x
. cette variable est utilisée, une erreur sera signalée. Par conséquent, un typeof
sera lancé lorsque ReferenceError
sera exécuté.
À titre de comparaison, si une variable n'est pas déclarée du tout, l'utilisation de typeof
ne signalera pas d'erreur.
typeof undeclared_variable // "undefined"
Dans le code ci-dessus, undeclared_variable
est un nom de variable qui n'existe pas, et le résultat est "indéfini". Par conséquent, avant qu'il n'y ait pas de let
, l'opérateur typeof
était 100 % sûr et ne signalerait jamais d'erreur. Ce n'est plus vrai. Cette conception vise à aider chacun à développer de bonnes habitudes de programmation. Les variables doivent être utilisées après avoir été déclarées, sinon une erreur sera signalée.
Certaines "zones mortes" sont cachées et difficiles à trouver.
function bar(x = y, y = 2) { return [x, y]; } bar(); // 报错
Dans le code ci-dessus, la raison pour laquelle l'appel de la fonction bar
signale une erreur (certaines implémentations peuvent ne pas signaler d'erreur) est que la valeur par défaut du paramètre x
est égale à une autre paramètre y
, et à ce moment y
Il n'a pas encore été déclaré, il appartient à la "zone morte". Si la valeur par défaut de y
est x
, aucune erreur ne sera signalée car x
a été déclaré à ce moment.
function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2]
De plus, le code suivant signalera également une erreur, qui est différente du comportement de var
.
// 不报错 var x = x; // 报错 let x = x; // ReferenceError: x is not defined
L'erreur signalée par le code ci-dessus est également due à la zone morte temporaire. Lors de l'utilisation de let
pour déclarer une variable, une erreur sera signalée tant que la variable est utilisée avant que la déclaration ne soit terminée. La ligne ci-dessus appartient à cette situation. Avant que l'instruction de déclaration de la variable x
ne soit exécutée, la valeur de x
est prise, ce qui entraîne une erreur "x n'est pas défini".
ES6 stipule que la promotion de variable ne se produit pas dans les zones mortes temporaires et les instructions let
, const
Ceci vise principalement à réduire les erreurs d'exécution et à empêcher l'utilisation de la variable avant qu'elle ne soit déclarée, ce qui entraîne des erreurs inattendues. Comportement. Des erreurs comme celle-ci sont très courantes dans ES5, et maintenant que cette disposition est en place, il est facile de les éviter.
En bref, l'essence de la zone morte temporaire est que dès que vous entrez dans la portée actuelle, la variable que vous souhaitez utiliser existe déjà, mais elle n'est pas disponible. Vous ne pouvez l'obtenir et l'obtenir que lorsque. la ligne de code qui déclare la variable apparaît.
Recommandations associées :
Qu'est-ce que la pré-analyse JS ?
Quelle est la différence entre l'utilisation de l'index de chaîne js et la recherche
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!