1. >>> const a = 2 2. >>> var a = 3 3. >>> a = 4 4. >>> a // print 2
Pourquoi la ligne d'opération 3 est-elle autorisée? Const semble plus «global» que sans mot-clé …
Ceci est juste comment fonctionne const
(ou ne fonctionne pas):
Crée une constante 1 qui peut être globale ou locale à la fonction dans laquelle elle est déclarée. Les constantes suivent les mêmes règles de portée que les variables [… et ne peuvent pas partager de nom] avec une fonction ou une variable dans la même portée.
Firefox […] lance un TypeError si vous redéclare 2 [ce qui est différent de réaffecter] une constante. Aucun des principaux navigateurs ne produit d'avis ni d'erreurs 2,3 si vous attribuez une autre valeur à une constante [..], mais la réaffectation échoue (uniquement) dans Firefox et Chrome (au moins depuis la version 20).
Notez que const
ne fait pas partie de la spécification ECMAScript 5 et que la sémantique JavaScript 1.5 sera redéfinie dans ECMAScript 6.
Le comportement varie selon les implémentations du navigateur en ce qui concerne la sémantique de soutien et de re-déclaration / réaffectation.
1 Dans IE 9, en utilisant const a = 2
résultats dans
"Erreur de syntaxe"
2 Dans FF 14, const a = 2; var a = 3; a = 4; a
const a = 2; var a = 3; a = 4; a
const a = 2; var a = 3; a = 4; a
, lorsqu'il est évalué en tant que programme unique,
TypeError: redeclaration de const a
Qui est différent de l'exécution de chaque ligne un à la fois dans le REPL. Je soupçonne que c'est parce que var
est hissé au – dessus de la const
et parce qu'un const "ne peut pas partager un nom avec une fonction ou une variable dans la même portée".
3 Dans Chrome 21, const a = 2; var a = 3; a = 4; a
const a = 2; var a = 3; a = 4; a
const a = 2; var a = 3; a = 4; a
évalue à 2 sans avertissement ni message.
const
périmètre const
est défini comme 'bloc scoped' (dont la portée est limitée au bloc dans lequel il est déclaré).
Documentation MDN :
Les constantes sont à bloc-scoped , tout comme les variables définies à l'aide de la déclaration let. La valeur d'une constante ne peut pas changer par ré-affectation, et elle ne peut pas être redéclarée.
En ce qui concerne votre problème spécifique: d'abord, les commentaires indiqués const
sont pertinents dans ES6. Je ne sais pas de vous, mais je reçois (en tapant votre ligne 2: var a = 3;
): SyntaxError: L'identifiant 'a' a déjà été déclaré afin que votre exemple ne soit pas tout à fait possible.