预解析:程序在执行过程,会先将代码读取到内存中检查。会将所有的声明在此时进行标记,所谓的标记就是让js解释器知道有这个名字,后边在使用名字的时候,不会出现未定义的错误,这个标记过程就是提升。
声明:
1.名字的声明,标识符的声明(变量名声明) *名字的声明就是让我们的解释器知道有这个名字 *名字没有任何数据与之对应 2.函数的声明 *函数声明包含两部分: a.首先函数声明告诉解释器有这个名字存在,该阶段与名字声明一样 b.告诉解释器,这个名字对应的函数体是什么 *函数声明与函数表达式有区别,函数声明是单独写在一个结构中,不存在任何语句 逻辑判断等结构中
区分声明和表达式:
function f(){ function func(){ } //函数声明(函数后面不加分号) if(true){ function func2(){} //函数表达式 } var f=function func3(){}; //函数表达式 this.sayHello=function(){}; //函数表达式 var i=1; fucntion func4(){} //函数声明 var j=3; }
例子分析 1 :
var num=1; function num(){ alert(num); } num(); //报错:num is not a function console.log(num);//1
- 预解析代码:提升名字
*首先提升名字num,
*再提升函数名,但是名字已经存在,因此告诉解释器,让名字与函数体对应上
*得出代码中已有一个num函数
2.开始执行代码,第一句话从赋值语句开始,
*给num赋值为1,覆盖了num函数
3.调用num,由于num中存储的是1,因此报错
4.如果是打印num,就会输出1.