变量提升与函数提升
在JavaScript中,变量的定义和函数的定义都会被提升,而且函数的声明优先于变量的声明;在变量中,变量的赋值不会被提升,只是声明被提升了,但是函数的声明有点不一样,如果是函数式声明则函数体也会被一同提升,如果是var式的声明,怎么提升声明,不会提升函数体。
例子:
var a=3; function b(){ if(a){ var a=1; }else{ var a=0; } console.log(a); } b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
浏览器解析:
function b(){ var a; if(a){ a=1; }else{ a=0; } console.log(a); } var a; a=3; b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
例子:
var a=1; function b(){ a=10; return; function a(){}; } b(); console.log(a);//控制台输出:1;此时输出的a是全局变量。
浏览器解析:
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是全局变量。
例子:
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!'); }
浏览器解析:
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();