Skip to content

变量声明提前

JavaScript
var x = 1
function f() {
    console.log(x)
    var x = 2

}
f()
// 输出:undefined
// 解答:console.log() 打印的x,由于使用了var关键字,因此x的声明会被放到f()的最上方,但是赋值还是在原处。

函数声明提前

JavaScript
function f(){
    x()
    function x(){
        console.log(1)
    }
}
f()

// 输出:1
// 解答:上述代码x()调用是可以成功的,因为函数的声明也会提前到当前函数的最前面,也就是说,上面函数x会提前到f的最顶部执行

变量声明提前和函数声明提前的优先级

既然变量申明和函数申明都会提前,那谁的优先级更高呢?答案是函数声明的优先级更高!

JavaScript
var x = 1
function x(){}
console.log(typeof x)
// 输出number
// 答:函数先提升,函数名是 x ,后来遇到 var 并且 名字也是 x,
// 默认忽略,所以不处理var
// 执行阶段:发现有赋值操作,赋值为1 所以打印出 number,如果没有赋值操作 那x 永远是函数,默认跳过同名的var