我正在玩新的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控制台来运行测试。
答案 0 :(得分:4)
这是与here
中提到的Firefox相关的问题特定于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();