javascript高级进阶之变量提升和函数提升

变量提升

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而函数提升解决的是循环调用、递归问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值