Levage Javascript et déclaration de portée globale

Aug 21 2020

En javascript, la phase de compilation trouve et associe toutes les déclarations avec leurs portées appropriées.

CAS 1

a = 2;
console.log(a);

S'il n'est pas utilisé en mode strict, l'extrait de code est supposé être réellement traité comme:

var a;
a = 2;
console.log(a);

Sortie: 2

CAS 2

si la déclaration se produit sous console.log ()

  console.log(a); 
  var a = 2;

Ici à la ligne 1: le compilateur vérifiera la déclaration de a dans sa portée s'il n'est pas trouvé, la portée globale en assignera un et le même code sera à nouveau assumé

   var a; 
   console.log(a);
   a = 2;

Sortie: non défini // car aucune valeur n'est affectée pendant la lecture de la console de l'interpréteur

CAS3

 console.log(a); 
 a = 2;

Sortie: RefErr

Pourquoi cela génère une erreur de référence et n'est pas indéfini?

Réponses

1 AbhishekJain Aug 21 2020 at 14:19

Si vous regardez attentivement vos deux premiers cas, vous déclarez toujours la variable a, et en JavaScript, seules les déclarations sont hissées.

Cela étant dit, dans votre Case 3, la variable an'est jamais déclarée, par conséquent, le levage n'est pas possible ici. Avec cela, il n'y a pas de variable par le nom adans le champ, et par conséquent, ReferenceError.

Si vous regardez la description de ReferenceError , elle se lit comme suit:

L'objet ReferenceError représente une erreur lorsqu'une variable inexistante est référencée.

1 Quentin Aug 21 2020 at 14:12

Les globaux implicites n'impliquent pas une varinstruction. Il n'y a pas de levage d'entre eux.