与此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"
我知道的是,上面的代码应该在全局范围内考虑这两个函数,但是似乎函数声明受块范围的影响。
答案 0 :(得分: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编译器的工作原理,这将使您对提升的工作原理有更好的了解。
答案 1 :(得分:1)
看来这个问题是由于javascript吊起。出于某种原因,从我可以告诉您的意义上,您在块范围内声明函数会更改它的吊起方式。在此处阅读更多信息:https://www.w3schools.com/js/js_hoisting.asp