为了账号安全,请及时绑定邮箱和手机立即绑定

请大神解释下,为什么执行结果会不一样?

请大神解释下,为什么执行结果会不一样?

慕田峪8701529 2017-11-26 17:06:42
var add = (function () {    var counter = 0;    return function () {return counter += 1;}})();add();add();add();console.log(add())  //结果是4var add = function () {   var counter = 0;   return function () {return counter += 1;}};add()();add()();add()();console.log(add()())  //结果是1
查看完整描述

3 回答

?
cxxyjsj

TA贡献119条经验 获得超22个赞

第一种是闭包的写法. 注意一下第4行最后的();  程序运行到第4行,实际已经执行了匿名方法,并且把返回值(方法)赋值给add. 因此add每次调用都进行counter++.最终结果为4

第二种就是一个方法定义,每次调用add()时候返回方法,然后再调用返回的方法,这就导致了counter每次都被重新初始化为0. 因此不管执行多少次,结果都是1

查看完整回答
反对 回复 2017-11-27
?
ruibin

TA贡献358条经验 获得超213个赞

闭包作用域问题,你每调用一次函数就产生一个作用域,第一种方式外层函数被调用一次,并返回一个函数,以后调用这个返回的内层函数,外层函数作用域的变量被保存下来。 第二种方式每次都调用一次外层函数,每次都有不同的作用域,所以每次外层函数的的值都是新的。

查看完整回答
反对 回复 2017-11-27
  • 3 回答
  • 3 关注
  • 2034 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信