Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对于立即调用的函数,常量变量未被提升_Javascript_Scope_Constants_Ecmascript 6_Hoisting - Fatal编程技术网

Javascript 对于立即调用的函数,常量变量未被提升

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

我在玩新的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(){
  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
,当您在干净的环境中仅运行这两个代码段时,是否会发生同样的情况?