嵌套块作用域中的函数声明

时间:2019-11-06 13:33:22

标签: javascript function scope

与此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"

我知道的是,上面的代码应该在全局范围内考虑这两个函数,但是似乎函数声明受块范围的影响。

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