【问题标题】:const keyword scope in JavascriptJavascript 中的 const 关键字作用域
【发布时间】:2012-09-04 23:57:13
【问题描述】:
1. >>> const a = 2
2. >>> var a = 3
3. >>> a = 4
4. >>> a // print 2

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

【问题讨论】:

  • const 定义了一个常量(在支持的浏览器中)。你为什么期望能够改变它?如果您尝试更改 const 的值,JavaScript 不会抛出异常,但会默默地忽略您的指令。
  • 请注意,constJavaScript™ 的一部分,它不是 ECMAScript 的一部分,正如 zerkms 所说,它的可用性取决于实现。

标签: javascript constants


【解决方案1】:

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

MDN documentation:

常量是块范围的,很像使用 let 定义的变量 陈述。常量的值不能通过 重新分配,并且不能重新声明。

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

【讨论】:

  • 很好的解释!在现代版本的 Chrome (v65) 中,这是正确的。在旧版本中,即 v48,这似乎不是他们实现它的方式。我制作了一个用于测试的 jsbin,v65 给出了“abcdef...”,v48 给出了“aaaa”,这意味着 const 是不可更改的,尽管是块级的:jsbin.com/vemaxeniho/edit?html,output 感谢发帖!
【解决方案2】:

这是is just how const works(或不起作用):

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

如果您重新声明2 [与重新分配不同] 常量,则

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2012-01-18
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多