15
1. >>> const a = 2
2. >>> var a = 3
3. >>> a = 4
4. >>> a // print 2

为什么允许运行3号线?const 似乎比没有任何关键字更“全局”...

4

2 回答 2

28

const范围被定义为“块范围”(其范围仅限于声明它的块)。

MDN 文档

常量是块范围的,很像使用let 语句定义的变量。常量的值不能通过重新赋值改变,也不能重新声明。

关于您的具体问题:首先正如评论所说const的与 ES6 相关。我不了解你,但我得到(输入你的第 2 行var a = 3;:):SyntaxError: Identifier 'a' has already been declared 所以你的例子不太可能。

于 2017-05-14T12:10:41.850 回答
13

这就是工作const方式(或不工作):

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

如果您重新声明2 [与重新分配不同] 常量,Firefox [..] 会引发 TypeError 。如果您为常量[..]分配另一个值,则主要浏览器都不会产生任何通知或错误2,3 ,但重新分配(仅)在 Firefox 和 Chrome 中不成功(至少从版本 20 开始)。

请注意,这不是constECMAScript 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并且因为 const “不能与同一范围内的函数或变量共享名称”。

3在 Chrome 21 中,const a = 2; var a = 3; a = 4; a计算结果为 2,没有警告或消息。

于 2012-09-05T00:02:18.533 回答