与reference一样,函数声明语句和变量声明也不具有块作用域。所以我要问为什么下面的代码以这种方式执行。
//javascript es6
{
function bar() {
console.log("1");
}
}
function bar() {
console.log("2");
}
bar(); //prints "1" not "2"
this.bar() //also prints "1" not "2"
我知道的是,上面的代码应在全局范围内考虑这两个函数,但似乎函数声明受块范围的影响。
最佳答案
基本上,函数声明在代码执行之前运行。
让我尝试使其更清楚。
让我们首先将函数重命名为此,以便我可以更好地解释其工作原理:
{
function bar() {
console.log("1");
}
}
function foo() {
console.log("2");
}
编译器的作用是扫描js文件,并发现有一个函数声明为foo函数(忽略括号内的一个)。然后,它像往常一样运行js文件,放在括号内,然后看到在foo()函数之后声明了另一个函数声明(bar()函数)。
所以基本上,这是您将得到的结果:
bar() // returns "2"
{
function bar() {
console.log("1")
}
}
bar() // returns "1"
function bar() {
console.log("2")
}
bar() // returns "1"
我希望这是有道理的。
有关更多信息,请尝试查找函数表达式与函数声明,以及javascript编译器的工作原理,这将使您更好地了解提升的工作原理。