老师,我理解的对吗?

老师,我理解的对吗?

<script>

       console.log(a); // undefined,因为变量声明提升只提升定义

       var a = 1;

       console.log(a); // 1,给a赋值为1

       function a(){

           console.log(2);

       }

       console.log(a);  // 1

       var a = 3;

       console.log(a);  // 3,给a赋值为3

       function a(){

           console.log(4);

       }

       console.log(a);  // 3

       a();   // 4,调用函数a

</script>


正在回答

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

2回答

同学你好,理解的有点问题。函数体不会消失,函数在调用的时候,才会执行函数体,如果不调用,就不会执行。如下:

https://img1.sycdn.imooc.com//climg/6215efb009ca7f1e04340365.jpg

简单理解是预解析完后a是第二个函数,按照顺序执行代码时,a=1,数值覆盖了函数,下面代码3覆盖1,但是a还是变量,不是函数了。

如果代码这样写:

https://img1.sycdn.imooc.com//climg/6215f07b099f872303360191.jpg

先调用后赋值,预解析完后a是函数,调用没问题,输出4,然后a=1,覆盖后a是变量

https://img1.sycdn.imooc.com//climg/6215f08b097163a701540051.jpg

自己再理解下。

好帮手慕星星 2022-02-23 14:43:54

同学你好,第1和最后一次输出理解不对。

1、变量名称和函数名相同的时候,会提升最后一个函数体。所以第一次输出a的值为第二个a函数,不是undefined

https://img1.sycdn.imooc.com//climg/6215d747093f1e0a06070045.jpg

https://img1.sycdn.imooc.com//climg/6215d74e0931007704020102.jpg

2、函数在调用的时候才会执行,所以没有调用的时候会跳过函数体

https://img1.sycdn.imooc.com//climg/6215d7760976e74d04700373.jpg

第五次输出a的值为3,是变量,所以当做函数调用会报错

https://img1.sycdn.imooc.com//climg/6215d7a709a3d54403980033.jpg

祝学习愉快!

  • 提问者 临溪倚山靠 #1

    老师,关于最后一步调用函数a,我还是有些不理解。为什么第五次输出a的值会影响到调用函数a呢?调用函数a不就是调用最后一个函数体吗?最后一个函数体输出的就是4。


    老师,我想了想,是这样理解的:第一次输出a的值是第二个a函数,由于第二个a函数已经在预解析阶段定义了,所以不会在覆盖回来了,也就相当于第二个a函数已经在执行阶段消失了。这样理解对吗?

    2022-02-23 15:41:41
  • Dreamboat丶C 回复 提问者 临溪倚山靠 #2

    第五次输出的a为3,此时的a已经是变量名不是函数名了 ,用变量名调用函数当然就报错了

    2022-03-02 20:58:15
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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