Javascript中的const关键字范围

Joh*_*nGa 10 javascript const

1. >>> const a = 2
2. >>> var a = 3
3. >>> a = 4
4. >>> a // print 2
Run Code Online (Sandbox Code Playgroud)

为什么允许操作线3?const似乎比没有任何关键字更"全局"......

Mer*_*ury 14

constscope定义为'block scoped'(其范围仅限于声明它的块).


MDN文档:

常量是块范围的,非常类似于使用let语句定义的变量.常量的值不能通过重新赋值来改变,也不能重新声明.

关于您的具体问题:首先,正如评论所述const,与ES6相关.我不知道你但是我得到了(键入你的第2行var a = 3;:):SyntaxError:标识符'a'已经被声明,所以你的例子不太可能.


小智 11

是多么const的工作(或不工作):

创建一个常量1,它可以是声明它的函数的全局或局部.常量遵循与变量[..并且不能共享名称]相同的范围规则与同一范围内的函数或变量.

如果你重新声明2 [不同于重新分配]一个常量,Firefox [..]会抛出一个TypeError .如果您另一个值分配给常量 [..],但是在Firefox和Chrome中重新分配(仅限)(至少从版本20开始),主要浏览器都不会产生任何通知或错误2,3.

注意,const ECMAScript的5规范和JavaScript 1.5语义的部分将被重新定义中的ECMAScript 6.

在支持和重新声明/重新分配语义方面,浏览器实现的行为有所不同.


1在IE 9中,使用const a = 2结果

"语法错误"

2在FF 14中const a = 2; var a = 3; a = 4; a,当作为单个程序进行评估时,会产生

TypeError:const a的重新声明

在REPL中一次一行地执行每一行不同.我怀疑这是因为var悬挂上面const因为一个常量"不能在同一个范围内的函数或变量共享名".

3在Chrome 21中,const a = 2; var a = 3; a = 4; a评估为2,没有任何警告或消息.