Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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_Hoisting - Fatal编程技术网

Javascript 该起重设备如何在砌块范围内工作?

Javascript 该起重设备如何在砌块范围内工作?,javascript,hoisting,Javascript,Hoisting,有人问我一个问题 { 函数foo(){ console.log('A'); } foo(); foo=1; 函数foo(){ console.log('B'); } foo=2; console.log(foo); } console.log(foo)这是对Node.js中的调试器进行的分析。这并不能解释为什么会发生这种情况 涉及3个范围:局部范围、全局范围和块范围 我在Chrome浏览器上做了同样的分析。行为类似,唯一的区别是没有局部作用域,而是使用全局作用域代替局部作用域 代码 { fo

有人问我一个问题

{
函数foo(){
console.log('A');
}
foo();
foo=1;
函数foo(){
console.log('B');
}
foo=2;
console.log(foo);
}

console.log(foo)这是对Node.js中的调试器进行的分析。这并不能解释为什么会发生这种情况

涉及3个范围:局部范围、全局范围和块范围

我在Chrome浏览器上做了同样的分析。行为类似,唯一的区别是没有局部作用域,而是使用全局作用域代替局部作用域

代码

{
foo=1;
foo=2;
console.log(foo);
}
console.log(foo)
根据函数声明位置的,阻塞范围变量的值绑定到外部范围。此代码相当于:

let outerFoo;//这些函数在范围外创建绑定
{
让innerFoo;//但也在内部
//由于提升,函数在执行任何代码之前被绑定:
innerFoo=函数foo(){
console.log('A');
};
innerFoo=函数foo(){
console.log('B');
};
//在函数声明处,变量离开作用域
/*函数foo(){
console.log('A');
} */
outerFoo=innerFoo;
innerFoo();
innerFoo=1;
//这也适用于第二项声明
/*函数foo(){
console.log('B');
} */
outerFoo=innerFoo;
innerFoo=2;
console.log(innerFoo);
}

console.log(outerFoo)FWIW,Safari在这里给出了预期的“B2”。所以,至少要说明你在什么环境下得到这些结果。我希望这里是“b22”,但我不能说什么是“正确的”。根据某种定义,这种行为可能是“正确的”。问题是:为什么会有差异?为什么这是重复关闭?具体来说,是关于ES6和块范围的,而这里没有特定ES6语法的痕迹。这是一个好问题,值得回答。我甚至会悬赏。快点。。。(重新打开)@trincot可能是因为这个问题的首要答案准确地分解了区块级别发生的事情,以解释为什么会发生这种行为?ES6语法的存在与否似乎并不重要matter@trincot否定缺乏ES6。ES6之前不存在块作用域。此外,在ES6之前没有块作用域函数(假设没有块作用域,这并不奇怪,但超出了
if(true)函数f(){return true;}else函数f(){return false;}
只创建后一个函数。ES6之后,这一点没有得到纠正,因此只定义了运行的分支中的函数声明,而不是最后一个总是覆盖前一个。这在很大程度上是一个ES6特定的问题。“本地范围”是什么意思?当代码在函数定义中时,这是函数作用域吗?这是传统的
var
function
dclarations的正常作用域。@Barmar我不知道局部作用域是什么意思。这是调试器向我展示的。这里是一个屏幕截图:你可以在
Block
中看到一个变量
foo
,还有一个变量ble
foo
Local
中。这是两个不同的变量。还有一个不同的全局部分。@BenjaminGruenbaum是的,WebCompat语义是规范中我最喜欢的部分,因为如果你不知道它是如何指定的,行为看起来是如此随机:)我已经回答了其中的一些问题,所以我把这一个基本上编入了书签只要想象一下这些事情(比如
\uuuu proto\uuuu
)至今仍在TC39会议上积极讨论-最后一次更改是在11月IIRC,它仍在议程中。