不用var 定义a,代码如何预解析

不用var 定义a,代码如何预解析

http://img1.sycdn.imooc.com//climg/6060ccce0989264f05580442.jpg

老师这里的代码运行顺序,为什么不是 先把a=34在预解析的时候提上去,然后第一个document.write(a)输出为34呢

还有就是,不用var 定义a,相当于定义了一个全局变量,那么通过预解析这个a = 34,会被提升到最外层,还是函数内最上方呢~

正在回答

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

3回答

同学你好,对于你的问题解答如下:

1、下图代码中,声明函数func的时候,定义了形参a,此时相当于在func函数内部内部声明了一个局部变量a此时函数内部的a =6 这句代码不是新定义一个变量,而是给函数内部的局部变量a赋值,不会影响到全局变量a的值,a的值还是5。所以调用函数之后,输出的全局变量a的值为5

http://img1.sycdn.imooc.com//climg/606306c809c359e307510352.jpg

2、当定义函数不设置形参时,此时函数内部不使用var声明的变量,才是全局变量,同学可以结合下面的代码对比理解下,示例:

http://img1.sycdn.imooc.com//climg/606307a909eafde205510296.jpg

控制台输出结果:

http://img1.sycdn.imooc.com//climg/606307ba09ae647106130264.jpg

祝学习愉快~

好帮手慕慕子 2021-03-30 16:36:02

同学你好,对于你的问题解答如下:

1、同学想问的是指下面这段是不是可以理解为下面的a = 23 覆盖了 a =34 。如果是的的话,那么同学的理解是对的。

http://img1.sycdn.imooc.com//climg/6062e20b0916844d04110392.jpg

如果不是的,可以新建提问,详细描述下具体指的是哪里,便于帮助同学准确的定位与解决问题。

2、因为定义函数时,设置了形参a,相当于在函数内部声明了一个局部变量a, 函数中的a=34,是给局部变量a赋值,不会影响全局变量a。所以全局变量a依旧为23。

祝学习愉快~

  • 提问者 JennieLiu #1

    老师我发现我是不太清楚下面两段代码的区别:

    http://img1.sycdn.imooc.com//climg/60630303099699b010480388.jpg

    http://img1.sycdn.imooc.com//climg/60630311095e277809860383.jpg

    就是第二张图,函数内部,不用var 定义的变量 a = 6,会把值转递给形参,所以fun()输出 6,我理解,但是与此同时,这个a = 6 ,就不作为一个新定义的全局变量去覆盖掉 全局变量 var a = 5 了吗? 

    2021-03-30 18:56:32
好帮手慕慕子 2021-03-29 11:10:35

同学你好,对于你的问题解答如下:

1、预解析中的提升,只针对var关键字声明的变量和function关键字声明函数,所以不用var定义的变量a,在预解析阶段不会进行提升的。

2、预解析阶段只提升变量,在执行代码的时候才会给变量赋值,示例:

http://img1.sycdn.imooc.com//climg/606143380937dde202810132.jpg

上图中的代码,预解析阶段会提升变量a,所以在声明变量之前输出a不会报错,输出结果为undefined,执行完var a = 1 之后,才表示给a赋值1,所以在这之后才可以输出a的值为1,如下图所示:

http://img1.sycdn.imooc.com//climg/6061433d0997883104680153.jpg

经过上诉分析可知,本题代码中, a = 34 这句代码没有使用关键字var声明,所以预解析阶段并不会进行变量的提升。

因为定义函数时,设置了形参a,相当于在函数内部声明了一个局部变量a,此时函数内部就不会再沿着作用域链向外查找全局作用域的同名变量a,而调用fn函数时,没有传入值,所以函数内部在a =34之前输出a的值为undefined。

祝学习愉快~

  • 提问者 JennieLiu #1

    请问老师,是不是这段代码可以理解成这样呢?

    下面的 a = 23,覆盖了a = 34?


     <script>

          var a = 34;

          var a = 23;

          function fn(a) {

            document.write(a);

          }


          fn();

          document.write(a);

        </script>


    2021-03-30 13:34:52
  • 提问者 JennieLiu #2

    就是undifine理解了,还没理解后面为什么是23,不是34?,就是23 和 34都是a ,都是全局变量,这个先后顺序怎么判断呀

    2021-03-30 14:17:17
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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