老师,麻烦解答一下,谢谢~

老师,麻烦解答一下,谢谢~

<script type="text/javascript">
	var a=1;
	function fn(){
		console.log(a);
		var a=2;
		//return a;
	}
	fn();
	console.log(a);
</script>

老师,请问一下哈,第一个问题:

第一个console.log(a)是undefined,第二个是1,我能理解,因为预解析第一个a是undefined,第二个a是所在函数的全局变量,而不是整体的全局变量,并且预解析完逐行解读后a已经从undefined变为1了,所以第二个是console.log(a)是1;但是我在函数内添加return a,将函数内的a返回出来,为什么结果还是undefined和1呢,老师麻烦解读一下为什么不是undefined和2?


<script type="text/javascript">
	var a=1;
	function fn(){
		console.log(a);
		a=2;
	}
	fn();
	console.log(a);
</script>

第二个问题:

为啥我将函数内的var a=2改为了全局变量a=2之后,结果却是1和2呢,不是很能理解,我的理解是undefined和2,我的理解是这样的:函数的作用域范围内a=2意思就是在全局内为var a=2;那么第二个打印出2没问题,但是第一个var a=1在预解析不是解析为undefin了嘛?老师麻烦解答一下,谢谢!

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学,你好。

1、return返回的是结果,不会对任何东西造成影响,除非把返回的结果重新赋值,比如:

http://img1.sycdn.imooc.com//climg/5d2b112d0001f47c05230281.jpg

如果用a重新接收a的返回值的话,那后面一个就是2了。

2、通过作用域链找a的话,会往外找,外面的a是1,因为在下面重新给a赋值了为2,a是全局变量,所以它会在作用域链往外找。如果下面写的是var a=2的话,a就是局部变量,就不会沿着作用域链往外找,所以第一个例子中,a就是没定义,因为是在定义之前console的。

你可以重新再仔细听一下视频,老师都讲了,好好对比分析一下哦。

如果帮助到了你,欢迎采纳!

祝学习愉快!

  • 谢谢,差不多有点明白了,多看看案例应该没问题,老师我建议把在课程中多增加一些编程案例,这个还是得多练习才行
    2019-07-14 19:39:54
提问者 不会敲代码的小浩子 2019-07-14 16:37:41

而且,这两个案例中,fn都是不进行预解析的,fn函数就是其本身,为什么第一个console.log不会像第一个那样,通过作用域链向外找到已经解读过的var a=1呢?

如果说我的理解一直是错的,那是不是得按照下面的思路来理解?

思路:在代码中,第一个变量var a=1预解析为undefined,fn函数中也有a变量的情况下,根据a变量是否通过var声明,a变量在名字上是冲突的,所有有var的就会将fn预解析,没有var的就不会预解析,而不是两个fn都不进行预解析,预解析的fn函数就按照预解析规则先打出预解析的结果,而不预解析的fn函数则需要到逐条解读代码的时候才会执行console.log语句?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师