对常见闭包的理解

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>对常见闭包的理解</title>

</head>

<body>

  <script type="text/javascript">

    function fn1(){

      var a = 2

      function fn2(){

        a++

        console.log(a)

      }

      return fn2

    }  

    var f = fn1()

    f() // 3

    f() // 4

  </script>

</body>

</html>

  

自己对该闭包的理解:简单而言,fn1是外部函数,fn2是内部函数。在fn1执行时(15行),由于fn2提前声明,而声明内部函数时会产生闭包,因此此时闭包产生。

当执行到23行时,其实就是在fn1()中执行fn2(),因此a++,a由2变成3。因为执行fn1(),结束后返回的是fn2,而f后面有一个(),因此会执行fn2(),其实关键点在于22行(也可是说加上20行),让f指向了fn2,因此fn2就不会变成垃圾对象。

当执行到24行时,其实是在fn1()中再次执行一次fn2(),因此a再次++,a由3变成4。也就是说,只要不再次执行fn1(),闭包就不会结束,因此函数内的局部变量进行了延续。简单而言就是在同一个fn1()中多次执行fn2(),既然是在同一个fn1()中,那么fn1中定义的局部变量必然不会消失,因此看起来就是延长了局部变量的生命周期。

posted @ 2020-07-20 20:45  不会秃头的小胡  阅读(213)  评论(0)    收藏  举报