变量提升
console.log(ad);
//把调用函数放在声明变量前面叫变量提升
var ad = 1;
结果undefined
function hoistVariable(){
if(!foo){//undefined取反得ture
var foo = 5;
}
console.log(foo);//5
}
hoistVariable();
结果为5
var foo = 111;//外部的变量不会影响内部
function hoistVariable(){
console.log(foo);//undefined
if(!foo){//undefined取反得ture
var foo = 5;
}
console.log(foo);//5
}
hoistVariable();
结果为5
如果当前作用域存在此变量声明,无论它在什么地方声明,引用此变量就会在当前作用域查找,不会去外层作用域了。
预编译之后:
function hoistVariable(){
var foo;
if(!foo){
var foo = 5;
}
console.log(foo);//5
}
hoistVariable();
即引擎将变量声明提升到了函数顶部
再举例
var foo = 3;
function hoistVariable(){
console.log(foo);//undefined
var foo = foo || 5;//双竖线能完成函数默认值赋值功能
}
console.log(foo);//5
}
hoistVariable();
结果为5
函数提升
aa(); //函数声明之前调用就是函数提升
function aa(){
console.log(1);
}
aa();
结果11
aa(); //函数声明之前调用就是函数提升
function aa(){
console.log(1);
bb();
function bb(){
console.log(22)
}
}
aa();
结果1 22 1 22
函数表达式不能进行函数提升
foo();//函数表达式不能提升
var foo = function(){
console.log(1);
}
结果报错
需要提前获取返回值时,就使用函数声明进行函数提升
如果是普通函数,不需要返回值,使用两种都可以
变量提升是不应该存在的,我们在写程序的时候要先声明再调用
封装的类库应该包裹在{ }它才会形成自己的作用域不会和其他的库和其他人的代码冲突
为什么要进行提升
函数提升就是为了解决相互递归的问题。
变量提升是bug而函数提升解决的是循环调用、递归问题。