闭包经典问题

  function test() {
    var n = 4399;
    function add() {
      n++;
      console.log(n);
    }
    return { n, add };
  }
  var result = test();
  var result2 = test();
  result.add();//4400
  result.add();//4401
  console.log(result.n);//4399
  result2.add();//4400

test是一个外部函数,它返回一个内部函数,这个内部函数可以访问并修改 test中的 变量,即使 test已经执行完毕。这样,每次调用 n,它都会记住上次调用的状态。这就是闭包的一个典型用法。由此,result.add()两次调用都会根据上次状态值+1

为什么result.n打印是4399呢?

原因在于result对象返回的是一个包含属性n和方法add的对象,而这个属性n的值是在test函数内部定义并赋值为4399的。尽管add方法会修改作用域内的局部变量n,但每次调用test函数时都会创建新的n变量,它与之前返回对象中的n属性值是分离的。

当执行var result = test();var result2 = test();时,每次调用test函数都会创建一个新的作用域,并且在其中生成一个新的n变量。所以,result和result2分别拥有独立n值和add方法。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值