1.变量定义提升:

声明语句:

(1)var声明语句:

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

functionfun(){alert(x);varx=666;alert(x);}//此函数在js真正执行前,会根据变量声明提前变为:functionfun(){varx;//变量声明语句提前,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会将此代码拆分为两行代码分别执行。因此会变成:



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

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

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