const变量没有为立即调用的函数提升

时间:2015-05-27 09:34:43

标签: javascript scope const ecmascript-6 hoisting

我正在玩新的ECMASCRIPT-6 const 关键字。我不明白关键字的一个特定行为。

假设我有两个功能

第一个案例

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

第二个案例

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

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

  

ReferenceError:在初始化

之前无法访问词法声明`_t'

对于第二种情况,输出为(精细)

  

未定义

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

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

2 个答案:

答案 0 :(得分:4)

这是与here

中提到的F​​irefox相关的问题

特定于Firefox的笔记

  

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

     

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

     
    

{const a = 1}; a现在抛出一个ReferenceError,并且由于块作用域而不再返回1。     const a;现在抛出一个SyntaxError(" missing = in const declaration"):需要一个初始值设定项。     const a = 1; a = 2;现在还抛出一个SyntaxError("无效赋值给const a")。

  

我也发现了一些here

我认为Firefox引擎对const吊装非常严格。

我认为这是有道理的。

答案 1 :(得分:2)

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

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

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

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

function t(){
  {
    const _y = 11;
  }
  console.log(_y); // _y is out of scope
}
t();