函数提升与变量提升
在JavaScript中,变量的定义和函数的定义都会被提升,而且函数的声明优先于变量的声明;在变量中,变量的赋值不会被提升,只是声明被提升了,但是函数的声明有点不一样,如果是函数式声明则函数体也会被一同提升,如果是var式的声明,怎么提升声明,不会提升函数体。
例子1:
var a=3;
function b(){
if(a){
var a=1;
}else{
var a=0;
}
console.log(a);
}
b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
例子2:
function b(){
var a;
if(a){
a=1;
}else{
a=0;
}
console.log(a);
}
var a;
a=3;
b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
例子3:
var a=1;
function b(){
a=10;
return;
function a(){};
}
b();
console.log(a);//控制台输出:1;此时输出的a是全局变量。
例子4:
function b(){
function a(){};//函数提升,声明局部函数a;
a=10;//将函数a强制进行类型转换为number,并赋值为10;此时的a是局部变量;
return;
}
var a;
a=1;
b();//函数b的返回结果为undefined,因为在函数体里面,没有return任何东西;
console.log(a);//控制台输出:1;此时输出的a是全局变量。
例子5:
a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;
b();//控制台输出this is b funciton! ;函数b可以被提升;
var a=function(){
console.log('this is a function!');
}
function b(){
console.log('this is b function!');
}
例子6:
function b(){
console.log('this is b function!');
}
var a;
a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;
b();//控制台输出this is b funciton! ;函数b可以被提升;
a=function(){
console.log('this is a function!');
}
对于全局作用域范围的变量,var与没有var是有区别的,没有var的写法,其变量不会被提升。eval里面的变量也不会被提升;
例子
console.log(a);//控制台报错,a未定义;a变量没有被提升;
a=1;
console.log(b);//控制台输出undefined;b未赋值;b变量得到提升;
var b=1;
function b(){
console.log(a);//控制台输出undefined;a声明得到提升;
var a=10;
}
function d(){
console.log(c);//控制台报错,变量c没有定义;c声明没有得到提升;
eval("var c=10");
}
b();
d();