为什么多出来一个f1()();结果不一样

为什么多出来一个f1()();结果不一样

 function f1() {
        var n = 999;

        nAdd = function() {
          n = n + 1;
        };

        function f2() {
          console.log(n);
        }

        return f2;
      }

      var rs = f1();
      rs();
      nAdd();
      rs();

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

function f1() {
        var n = 999;

        nAdd = function() {
          n = n + 1;
        };

        function f2() {
          console.log(n);
        }

        return f2;
      }

      var rs = f1();
      f1()();
      rs();
      nAdd();
      rs();

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


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

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

3回答
好帮手慕粉 2020-03-17 10:30:38

“qq_慕粉9137647”同学你好,关于同学的问题回答如下:

1、在函数中,前面有var声明的就是局部变量,不能在函数外部直接进行访问。没有var声明就是全局变量,可以直接在外部进行访问。例:

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

控制台:

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

在这个里面,nAdd也是一样的,它相当于test1,可以在外部直接进行访问。

2、不调用f1函数是不可以执行nAdd函数的,因为函数不调用是不会执行的,只有调用了f1,才能执行f1函数内部的代码。

3、改变的是f1作用域下的n,执行结果不一样是因为函数调用顺序问题:

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

4、同学如果有问题,建议同学新建一个问答进行提问呢,这样即有利于同学后期的复习与整理,老师也能更快的看到同学的问题。

同学再理解一下。

祝学习愉快~

好帮手慕粉 2019-12-08 15:28:17

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

1、理解的是有偏差的。nAdd函数并不是f1()()调用的,它是全局变量,nAdd()就可以进行调用,它的调用与f1()()与rs()都没有关系。

2、是产生了两个闭包,每个闭包作用域里面的都不会互相影响,在调用f1()()时,调用nAdd()执行n+1改变的是f1()()作用域里面的n,而rs()作用域里面的n没有受到影响。

这块的内容本身就晦涩难懂,同学慢慢来。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 老师 1、既然nAdd是全局变量,那改变nAdd的话不应该是rs所在的闭包和f1()所在的闭包内的n都改变吗?为什么只有f1的那个改变呢?难道rs所在的闭包中nAdd不在了吗? 2、nAdd是全局变量,那是说如果不调用f1(),nAdd也可以进行调用吗?调用以后会改变f1内的n,但是改变了的n无法取到?再调用f1()的话又会初始化n=1? 3、如果nAdd声明的时候用了var,那不调用f1()还能访问到它吗?如果不能的话是不是只有先调用f1()才能调用nAdd()?
    2020-03-16 19:09:22
好帮手慕粉 2019-12-08 10:15:56

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

1、先看第一部分的代码:

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

2、再看第二部分的代码,这样调用后,产生2个闭包,每个闭包之间独立,每一个闭包中都会有自己的n值。nAdd执行时,第一个闭包的nAdd被覆盖,变成第二闭包的nAdd了,所以nAdd改变的是第二个闭包的值:

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

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 Bravura #1
    我这样理解对吗,因为rs第一次调用,所以后面f1()()调用后,nAdd变成f1()()的,所以即时调用了nAdd()(),都是f1()()调用,与rs无关,而f1()()每次都会初始n=999,所以rw调用也只是n=999。
    2019-12-08 13:32:50
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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