10

我在玩新的 ECMASCRIPT-6 const关键字。我不理解关键字的一种特定行为。

可以说我有两个功能

第一个案例

(function(){
  console.log(_t); 
  const _t=10;
})();

第二种情况

function t(){
  console.log(_y); 
  const _y=11;
}
t();

对于第一种情况,输出是(不明白为什么)

ReferenceError:在初始化之前无法访问词法声明`_t'

对于第二种情况,输出是(很好)

不明确的

第二种情况的输出与预期的一样,但我不知道为什么第一种情况的结果会引发错误。从错误中可以推断出变量没有被提升。但为什么?我在这里发现const使用块范围。它与这个范围界定有什么关系吗?

我正在使用 Firefox Developer Version 控制台运行测试。

4

2 回答 2

4

这是此处提到的与 Firefox 相关的问题

Firefox 特定说明

const 声明早在 const 出现在 ECMAScript 6 规范中之前就已经在 Firefox 中实现了。对于 const ES6 合规性,请参阅错误 950547 和错误 611388。

从 Gecko 36 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33) 开始:

{const a=1};a 现在抛出一个 ReferenceError 并且由于块作用域而不再返回 1。常量一个;现在抛出一个 SyntaxError ("missing = in const declaration"): 需要一个初始化器。常数 a = 1; a = 2; 现在也抛出一个 SyntaxError(“对 const a 的无效赋值”)。

我也在这里找到了一些东西

我认为 Firefox 引擎对 const 提升非常严格。

我认为这是有道理的。

于 2015-05-27T10:45:31.160 回答
2

当我在 Firefox (38.0.1) 中尝试时,两者都收到相同的错误消息;它在初始化之前无法访问它。这是有道理的,因为唯一的区别是有一个函数表达式和一个函数声明。

常量标识符实际上是被提升的,这就是为什么你在初始化之前得到它无法访问的错误。

在这种情况下,块范围和功能范围是相同的,因为功能代码块是您拥有的唯一块。

如果您添加一个代码块,以便在使用时常量超出范围,您将收到错误消息“ReferenceError: _y is not defined”:

function t(){
  {
    const _y = 11;
  }
  console.log(_y); // _y is out of scope
}
t();
于 2015-05-27T09:43:34.693 回答