老师!请教一段代码

老师!请教一段代码

function counter(){
  var n = 0;
  return{
     count: function(){
        return n++;
     },
     reset: function(){
        n = 0;
     }
  };
}
var c = counter(), d = counter();    // 创建两个计数器
c.count();                    // => 0
d.count();                    // => 0; 它们互不干扰
c.reset();                    // reset() 和 count() 方法共享状态
c.count();                    // => 0; 因为我们重置了c
d.count();                    // => 1; 而没有哦重置 d

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

老师!

这是我在书上看到的关于闭包的一个例子,但是完全看不明白,所以敲下来请教一下老师!

正在回答

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

2回答

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

1、n++运算先返回n值,然后再进行加1,所以第一次计算n++的结果是0

2、Counter函数调用几次,形成几个作用域。n是局部变量,所以操作当前作用域中n值的时候,其他作用域中的n值不受影响。C调用了reset方法,那么就是c作用域中的n值变为0,d作用域中的n值不改变。第二次调用count方法的时候,c作用域中n++的值为0,d作用域中n++的值为1

祝学习愉快!

  • 沉木岩 提问者 #1
    大概明白了,但是这句: c.reset(); // reset() 和 count() 方法共享状态 也就是说在c作用域下,return里的两个方法,最终出去的结果是以 reset方法结果为主,因为reset方法里面n = 0;所以第二次调用对于count 方法来说 c被重置了 调用count 里的n++ 就是0; 关于++ return 如果return在方法外面是不是就是++计算之后的结果,如果是直接return的 n++ 就是n的值本身,第二次再循环调用才会计算++,老师是这么理解的嘛
    2020-08-11 23:56:09
好帮手慕星星 2020-08-12 09:24:37

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

1、关于c.reset(); 理解的没有问题

2、关于n++理解的不对,n++返回值是n,但是n值本身增加了1,并不是第二次计算的时候再加1 。例如

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

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

所以第二次计算的时候是1++ 。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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