注意javascript变量声明提升的陷阱

变量声明提升(hoisting)的概念不太容易描述清楚

先看段代码

var g="global";//全局变量
function foo(){
	console.log(g);//想要的预期结果global,而实际上结果是 undefined
	var g="local";
	console.log(g);//结果为 local
}
foo();

可以看到第一次显示g的时候,没有按我们的预期的显示结果,之所以会这样是因为,所有局部变量的声明都会被提升到最顶层,即上面的代码等效于下面的代码

var g="global";//全局变量
function foo(){
	var g; //局部变量,但没赋值 相当于 var g=undefined;
	console.log(g);//结果是 undefined
	g="local";
	console.log(g);//结果为 local
}
foo();
为了避免这样的错误,最好在函数的开始就声明要用的所有变量,并且变量名最好不要与全局变量同名。


再来看看函数的声明提升

function foo(){
	console.log("global foo");
}

function boo(){
	console.log("global boo");
}
function test(){
	console.log(typeof foo);//结果为 function
	console.log(typeof boo);//结果为 undefined
	
	foo();//结果为 local foo
	boo();//运行出错 TypeError: undefined is not a function
	
	function foo(){
		console.log("local foo");
	}
	
	var boo=function(){
		console.log("local boo");
	}
}
test();
根据前面变量声明提升的概念,我们可以清楚为什么boo()会执行报错,因为boo作为一个变量被提升了,运行boo()时,它还只是个undefined的变量,所以运行错误。

但是foo()并没有出错,是因为,变量foo的声明和实现被同时提升了,即上面代码等于下面的

function foo(){
	console.log("global foo");
}

function boo(){
	console.log("global boo");
}
function test(){
	function foo(){
		console.log("local foo");
	}
	var boo;
	console.log(typeof foo);//结果为 function
	console.log(typeof boo);//结果为 undefined
	
	foo();//结果为 local foo
	boo();//运行出错 TypeError: undefined is not a function
	
	boo=function(){
		console.log("local boo");
	}
}
注意test()函数内的 foo boo的声明方式不一样的 

function foo(){}这样的声明可以连同实现体一起被提升

var boo=function(){}这样的方式,只有声明被提升了,实现还是在后面执行

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、 3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值