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声明的变量,具体怎么提前,上面的例子已经很清楚了。