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编译器的工作原理,这将使您更好地了解提升的工作原理。

09-25 19:27
查看更多