1. >>> const a = 2
2. >>> var a = 3
3. >>> a = 4
4. >>> a // print 2
为什么允许操作线3? const似乎比没有任何关键字更“全局”......
答案 0 :(得分:10)
const
范围被定义为'块范围' (其范围仅限于声明它的块)。
常量块范围,非常类似于使用let定义的变量 声明。常数的值不能改变 重新分配,并且不能重新声明。
关于您的具体问题:
首先,评论说const
与ES6相关。我不了解你,但我得到了(输入你的第2行:var a = 3;
):SyntaxError:Identifier' a'已经宣布
所以你的例子不太可能。
答案 1 :(得分:9)
这是is just how const
works(或不起作用):
创建一个常量 1 ,它可以是声明它的函数的全局或局部。 常量遵循与变量[..且不能共享名称]相同的范围规则与同一范围内的函数或变量。
如果你重新声明 2 [不同于重新赋值]常量,那么Firefox [..]会抛出一个TypeError。 如果将另一个值分配给常量 [..] ,主要浏览器都不会产生任何通知或错误 2,3 但是Firefox和Chrome中的重新分配(仅限)(至少从版本20开始)。
请注意,const
不是ECMAScript 5规范的一部分,而且HTML 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,没有任何警告或消息。