变量声明提前
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