• 4
  • 新人请关照

关于JS中的闭包,求解答

  function f1(){
      var result=0;
      return function (){
          return result++
      }
  }
 let a1=f1()

1.第一次调用a1()的时候为什么输出0而不是1呢,不是已经++了吗
2.a1()多次执行的结果是0,1,2,3....那为什么f1()()就全都是0呢
3.好多人都说result一直存在于内存中是因为a1引用的原因,那下面这个函数也是a1引用了呀,

 function f1(){
     var result=0;
     return result++
     
 }
let a1=f1()

求解答

阅读 149
评论
    2 个回答
    • 144

    第一个问题 : 为什么已经++了还是0而不是1呢,首先你要搞懂 i++ 和 ++i是两个不一样的,如果是return ++result 那么实惠输出1

    第二个问题 : 因为a1()执行多次因为他们所处的作用域是一样的 , 为什么不写a1 = f1()直接f1()()每次都是输出0呢,原因就是每次f1()得到的函数都是不同的,所以产生的闭包所处作用域也是不同,所以每次输出0

      • 230

      通常情况下,函数在调用完毕,其内部变量会被自动销毁

       function f1(){
           var result=0;
           return result++
           
       }

      上述f1 函数返回的是一个数值类型,用完即丢弃。每调用一次,重新生成一个。

       function f1(){
            var result=0;
            return function (){
                return result++
            }
        }

      而这里的f1返回的是一个函数,它间接持有外层函数变量值result。当你使用该返回函数,你不仅拥有该函数本身,还隐性抵达有外层函数环境。正因如此,有些模式会将闭包作为某种私有权限的封装。
      当你对返回的函数进行重复调用时,自然会累积操作“私有的”result
      而外层函数又被调用了,则意味着又一个新的开始。

        撰写回答

        登录后参与交流、获取后续更新提醒