Javascript 对于立即调用的函数,常量变量未被提升
我在玩新的ECMASCRIPT-6const关键字。我不理解关键字的一个特殊行为 假设我有两个函数 第一例Javascript 对于立即调用的函数,常量变量未被提升,javascript,scope,constants,ecmascript-6,hoisting,Javascript,Scope,Constants,Ecmascript 6,Hoisting,我在玩新的ECMASCRIPT-6const关键字。我不理解关键字的一个特殊行为 假设我有两个函数 第一例 (function(){ console.log(_t); const _t=10; })(); function t(){ console.log(_y); const _y=11; } t(); 及 第二种情况 (function(){ console.log(_t); const _t=10; })(); function t(){ conso
(function(){
console.log(_t);
const _t=10;
})();
function t(){
console.log(_y);
const _y=11;
}
t();
及
第二种情况
(function(){
console.log(_t);
const _t=10;
})();
function t(){
console.log(_y);
const _y=11;
}
t();
对于第一种情况,输出为(不理解原因)
ReferenceError:无法在初始化之前访问词法声明“%u t”
对于第二种情况,输出为(精细)
未定义
第二个案例的输出和预期的一样,但我不知道为什么第一个案例的结果会抛出错误。从错误中可以推断变量未被提升。但是为什么呢?我发现const
使用块范围。这和范围界定有什么关系吗
我正在使用Firefox开发者版本控制台来运行测试。当我在Firefox(38.0.1)中尝试它时,我得到了相同的错误消息;它在初始化之前无法访问它。这是有意义的,因为唯一的区别是有一个函数表达式和一个函数声明
常量标识符实际上被提升,这就是为什么在初始化之前无法访问它的错误
在这种情况下,块作用域和函数作用域是相同的,因为函数代码块是您仅有的块
如果添加代码块,使常数在使用时超出范围,则会收到错误消息“ReferenceError:\u y未定义”:
这是中提到的与Firefox相关的问题 Firefox特定注释 const声明早在ECMAScript 6规范中出现const之前就已经在Firefox中实现了。有关const ES6合规性,请参阅错误950547和错误611388 从Gecko 36(Firefox 36/Thunderbird 36/SeaMonkey 2.33)开始: {const a=1};a现在抛出一个ReferenceError,由于块作用域,不再返回1。 常数a;现在抛出一个SyntaxError(“missing=in const声明”):需要一个初始值设定项。 常数a=1;a=2;现在还抛出一个SyntaxError(“对常量a的无效赋值”) 我也发现了一些东西 我认为Firefox引擎对常量提升非常严格
我认为这是有道理的 这是有道理的。但这应该适用于这两种情况。在吊装过程中,仅吊装报关单。和
{const a;a=1}
抛出syantaxeror
。但这两种类型的函数声明都应该如此。是的,你是对的。这只发生在firefox上。Chrome没有抛出任何异常。我缺少一个解释,为什么函数声明和IEFE的行为(严格的ES6或一些松散的遗留内容)不同?您遇到了,它还没有完全跨浏览器实现。请参阅了解它应该如何工作。不过,我无法解释第二种行为——在我看来这是一个bug。您是否在外部范围(在运行的其他代码中)中定义了任何\y
,当您在干净的环境中仅运行这两个代码段时,是否会发生同样的情况?