1.变量定义提升:

   声明语句:

(1)var声明语句:

         变量声明语句会被“提前”至脚本或者函数的顶部,但是初始化的操作则还在原来var语句的位置执行。例如,下面的例子,所示:

 function fun(){    alert(x);    var x=666;    alert(x);}//此函数在js真正执行前,会根据变量声明提前变为:function fun(){    var x;  //变量声明语句提前,    alert(x); //结果为"undefined"    x=666;    //初始化的操作还在原来的位置    alert(x);//结果为“666”}

(2)function声明语句:用来定义函数的

           函数定义表达式: var f= function(x){return x+1;}//匿名函数表达式

                          Var f=function ff(x){return x+1;}//具(有)名函数表达式,

具名函数表达式的函数名只能在创建函数内部使用,即采用此种方法创建的函数在函数外层只能使用f不能使用ffi的函数名。ff的命名只能在创建的函数内部使用

           函数声明语句:  function f(x){return x+1;}

使用函数声明语句的话,函数名称和函数体均提前,使用函数定义表达式js会将此代码拆分两行代码分别执行。先把变量名提升,函数的表达式仍然在原来的位置.如下面的例子,所示:

  在javascript引擎进行“预编译”时,也就是代码真正执行之前,会有“声明提前”,下面的函数例子,var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。因此会变成:

 

var getName = function () { alert (“xiyin”);};//通过函数变量表达式创建了一个getName的函数function getName() { alert (“xiyin11”);}   //声明一个叫getName函数。   var getName;//只提升变量声明function getName() {alert (“xiyin11”);}   //提升函数声明,覆盖var 的声明getName=function(){ alert (“xiyin”);}  //函数表达式剩下的赋值再次覆盖function getName声明

所以在执行getName()时,输出的结果是xiyin

总结:这就是在js中常说的变量声明提前,这种小细节容易被忽略,所以在这,做个简单总结。变量声明提升,对于两种形式成立,var声明的变量,function声明的变量,具体怎么提前,上面的例子已经很清楚了。