JavaScript中的吊装声明与表达式

时间:2019-01-01 19:53:40

标签: javascript hoisting

我想了解有关何时在JavaScript中使用函数表达式与函数声明的更多信息,并且偶然发现this文章,其中包含以下代码片段:

function foo(){
    function bar() {
        return 3;
    }
    return bar();
    function bar() {
        return 8;
    }
}
alert(foo());

令我惊讶的是,由于起吊,其计算结果为8。当一个声明被吊起时,它是否一直移动到函数的顶部(它会在返回3的第一个bar()之前被吊起),还是会在所有其他函数声明之后被吊起(它将被吊起)在第一个返回3的bar()之后?

2 个答案:

答案 0 :(得分:1)

javascript编译器将提升第一个bar函数,然后涉及第二个函数。这就是为什么我们得到的输出为8

答案 1 :(得分:0)

吊装发生在编译阶段,因此在吊装过程中会保留给定范围内的声明顺序。想象一下,解释器分两次读取代码,首先,它只关心在给定范围内声明的内容,然后实际进行计算。

这就是您的示例返回8的原因;如果bar的第二个声明高于第一个声明,则对bar()的调用将返回3

另请参阅:MDN documentation on hoisting