Scope de mots clés const sur Javascript

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é audessus 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.