老师,麻烦解答一下,谢谢~
<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了嘛?老师麻烦解答一下,谢谢!
正在回答
同学,你好。
1、return返回的是结果,不会对任何东西造成影响,除非把返回的结果重新赋值,比如:
如果用a重新接收a的返回值的话,那后面一个就是2了。
2、通过作用域链找a的话,会往外找,外面的a是1,因为在下面重新给a赋值了为2,a是全局变量,所以它会在作用域链往外找。如果下面写的是var a=2的话,a就是局部变量,就不会沿着作用域链往外找,所以第一个例子中,a就是没定义,因为是在定义之前console的。
你可以重新再仔细听一下视频,老师都讲了,好好对比分析一下哦。
如果帮助到了你,欢迎采纳!
祝学习愉快!
而且,这两个案例中,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 星