Levage Javascript et déclaration de portée globale
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
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.
Les globaux implicites n'impliquent pas une varinstruction. Il n'y a pas de levage d'entre eux.