声明提升
什么是声明提升?
函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
从它们在代码中出现的位置被“移动”到了最上面,这个过程就叫作提升(hoisting)
变量声明提升
通过var定义(声明)的变量,在定义语句之前就可以访问到 值:undefined
//先定义再赋值
//函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
//变量声明提升
console.log(a);//==>undefined
var a = 1;
console.log(a);//==>1
//相当于
var b;//声明提到最上方,赋值位置不变
console.log(b)//==>undefined
b = 1;
console.log(b)//==>1
函数声明提升
通过function声明的函数,在之前就可以直接调用
值:定义函数(对象)
//函数声明提升
func();
function func(){
console.log("func");//==>func
}
//相当于
function func(){
console.log("func");//==>func
}
//函数声明提到了前面
func();
在函数声明提升中,注意只有函数的声明会被提升,函数表达式不会被提升
JavaScript 初始化不会提升
JavaScript 只有声明的变量会提升,初始化的不会。
声明提升的注意事项==
1.var与function同时进行提升之后,var的声明会被提升到到function的声明之前。也因此,如果同一个作用域内,声明的函数名与声明的变量名相同,并且变量在声明时,没有进行赋值操作,变量会被函数覆盖。
//函数覆盖
//函数声明会覆盖变量声明
var a2;
function a2(){
}
console.log(a2);//==>function a2(){}
//如果变量值存在赋值操作,最终的值为变量的值
var a2 = 321;
function a2(){
}
console.log(a2);//==>321
2.变量的重复声明时没有用的,因为都会被提升到最前面执行,函数的重复声明会使声明在前的函数被覆盖。
//变量覆盖(无效)
var a1;
var a1 = 123;
console.log(a1);//==>123
//函数优先于变量 变量(无效)
var a3;
function a3(){
// console.log(2);
}
a3();//==>2
3.后面的函数会覆盖前面的函数声明
//避免在同一作用域重复声明
a4();//==>2
function a4(){
console.log(5);
}
function a4(){
console.log(2);
}