JS中的函数与变量提升
最简单的几条话:
在预编译时,先将代码中的函数和变量声明提到最顶端
其中函数声明的优先级大于变量声明
函数表达式相当于赋值,不会提升
几个经典案例
a();
var a;
function a()
{
alert(1);
}
a=function(){
alert(2);
}
//结果:
//1
var a=1;
function b(a)
{
alert(a);
var a=2;
alert(a);
function a(){}
}
b(3);
//结果:
//function a(){}
//2
var a = 1;
function b() {
alert(a);
if (!a) {
var a =2;
}
alert(a);
}
b();
//最终效果:
//undefined
//2
如果把上面这个例子加上a的赋值
var a = 1;
function b(a) {
alert(a);
if (!a) {
var a =2;
}
alert(a);
}
b(3);
//最终效果:
//3
//3
如果在函数体内再声明函数
function b(a){
alert(a);
var a=2;
alert(a);
function a(){}
}
b(3);
//结果
//function a(){}
//2
实际的过程是
1.创建AO对象:隐式的在函数中创建了AO的对象来盛放函数中的变量,此时对象没有值
2.找形参和变量声明:将变量和形参名作为AO属性名,a值为undefined
AO:{ a:undefined;}
3.将实参值和形参统一:将实参带入函数中,由于在函数外 a(3),因此AO中a =3
AO:{ a:3;}
4.在函数体里面找函数声明,值赋予函数体:由于在函数中有 function a() {} ,这一函数因此此时AO中 a = function a() {}
AO:{ a:function a() {};}
5.执行代码,a赋值为2,所以第二次输出为2