5-11 请老师解答一下

5-11 请老师解答一下

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>testt</title>
  </head>
  <body>
    <script>
          function fn1(){
      var num1= 1;
      var num2= 100;

      numadd= function(){//这样的表达式正确么?
      num2+=10;
      alert(num2);
      }

      function fn2(){
      num1+=1;
      alert(num1);
      }

      return fn2;
    }
      var result= fn1();
      result()
      numadd()// 为什么可以直接调用内层函数不报错?
      result()
    </script>
  </body>
</html>


这个我跑了一下,结果是2 110 3


但是几个问题没搞懂:

1、 numadd()// 为什么可以直接调用内层函数不报错?


2、如题这种声明函数的表达式正确么?

numadd= function(){
      num2+=10;
      alert(num2);
      }

 不是应该:

var numadd= function(){
      num2+=10;
      alert(num2);
      }


不过当我简化成下面这个样子,也没有报错:

var num1= 1;
      var num2= 100;

      numadd= function(){
      num2+=10;
      alert(num2);
      }
          numadd()



正在回答 回答被采纳积分+1

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

1回答
好帮手慕小李 2023-03-24 16:44:39

同学你好,解答如下:

https://img1.sycdn.imooc.com//climg/641d610f09c3227609320627.jpg

当前面写上var声明后,numadd方法就不再属于全局作用域中了,而是数与fn1函数作用域中。所以直接在全局下直接调用会报,numadd未定义。

老师这里举几个例子:

不用var声明时

https://img1.sycdn.imooc.com//climg/641d627b094f714e08040232.jpg

使用var声明时

https://img1.sycdn.imooc.com//climg/641d62ee097f234610240239.jpg

同学看看吧,祝学习愉快!

  • 提问者 慕桂英1122475 #1

    谢谢老师,还有几个问题:

    var result= fn1()
          numadd()
          result()

    在第一步:

    var result= fn1();

    这个时候fn1() 被调用了么?还是仅仅赋值给result,但是没有触发函数的调用机制?直到第二步 

    result()才触发调用机制?


    在第第三步:numadd()之前,

    numadd 被执行了么?还是仅仅被声明为一个全局变量?直到被numadd()调用?

    numadd在第一次调用fn1,被声明为全局变量后,是否意味着numadd上升到fn1函数以外,随时可以被调用,而不需要通过fn1调用了?




    2023-03-24 16:51:58
  • 好帮手慕小李 回复 提问者 慕桂英1122475 #2

    同学你好,解答如下:

    1、被调用了。而且fn1()这里是fn1函数的返回值,如下:

    https://img1.sycdn.imooc.com//climg/641d676409bffe0607860336.jpg

    2、numadd没有执行,它在fn1函数中只是声明了一个叫numadd全局变量,然后将后面的方法赋值给这个叫numadd的全局变量。

    这里要注意需要先将fn1方法执行,要不然numadd全局变量还没有声明,则直接调用会出现未定义的报错。

    直到numadd加括号后才是执行。

    2023-03-24 17:12:58
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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