js代码执行前,会有一个预编译过程,该过程主要进行以下操作:语法检查,和声明提升。
声明提升,又分为两部分:变量声明提升和函数声明提升。
声明提升的主要表现:先使用后声明。
变量声明提升:在当前代码块执行前,所有变量声明会在预编译阶段提前完成,所有变量被赋值为undefined,可以理解为变量提前创建。
console.log(num);//undefined
var num = 100;
/*以上代码可以理解为:
var num;
console.log(num);
num = 100;
*/
函数声明提升:函数对象在预编译阶段,已经完全创建完毕,可以随时使用。函数声明提升高于变量声明。
fn();
function fn(){
console.log("我被提前创建完成!")//我被提前创建完成!
}
//同时声明变量a和函数a
vara;
functiona() {}
alert(typeofa);//显示的是"function",初步证明function的优先级高于var。
//先声明函数后声明变量,证明上边的例子不是function覆盖了变量
functiona() {}
vara;
alert(typeofa);//显示的仍是"function",而不是"undefined",即function的优先级高于var。
//声明了变量的同时赋值
functiona() {}
vara = 1;
alert(typeofa);//number,此时不是function了。
//说明:"var a=1"相当于"var a;a=1",即先声明,后赋值,"a=1"相当于把a重新赋值了,自然就是number!
注意:if逻辑中声明的函数,不参与函数声明提升,但是参与变量声明提升;