Maison >interface Web >js tutoriel >Introduction détaillée au concept de « zone morte temporaire » en JS

Introduction détaillée au concept de « zone morte temporaire » en JS

php是最好的语言
php是最好的语言original
2018-08-08 10:09:337656parcourir

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 yIl 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn