闭包

作者: 王雪浩_强化班 | 来源:发表于2019-11-17 18:41 被阅读0次

    闭包:从一函数外部访问这一函数的内部函数,从而使这一函数内部变量持续存在的实现

    闭包的特性:

    函数嵌套函数

    内部函数引起外部函数中变量的变化

    参数和变量不会被垃圾回收机制回收

    首先,先来观察一个简单的闭包

        function fn(){

            var a = 1;

            return function(){  //核心代码1

                a++;

                console.log(a);

            }

        }

        var carry = fn();  //核心代码2

        carry();  //2

        carry();  //3

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    核心代码1:

    fn 函数执行完毕后把一个匿名函数当作返回值返回出来。

    核心代码2:

    var carry = fn(); 此行代码将 fn() 传递给变量 carry . 无论是在 Java 还是JavaScript中把一个带有返回值的方法传递给一个变量,那么传递的实质便是此变量等同于方法的返回值,即 carry 等于返回的匿名函数

    carry = function(){ a++; console.log(a); }

    既然 carry 等同于匿名函数,那么对于 carry 来说变量 a 即相当于一个全局变量,为了方便理解可以这样考虑:

    在这里插入图片描述

    对于 js 来说函数是可以随意嵌套的,那么全局变量也只是相对而言,就像上图中对于内涵函数 carry 来说 a 变量就是一个全局变量,如果只执行 carry 那么 a 就不会被重新定义,而是同全局变量一样保存在内存里。这样就可以实现闭包。

    闭包的其他实现方式

    IIFE:Immediately Invoked Function Expression,意为立即调用函数表达式。

    简介:如果有些函数只使用一次,那么立即执行就可以,连函数名都省掉,就是匿名函数

        <script>

        (function(){

            console.log("我是匿名函数");

        })();

        </script>

    1

    2

    3

    4

    5

    此方法不用被调用,立即执行,并且只执行一次。

    在最开始的例子中我们发现外部函数 fn 的变量定义只定义一次,闭包的核心只在返回函数,那么为了节省全局变量可以将外部函数设为 IIFE 。

    闭包实现中最重要的便是讲内部函数暴露在外面,下面讲解一下用 IIFE 实现,和暴露内部函数的方法

    暴露内部函数的方法一:通过return返回内部函数

        var fn = (function(){

            var a = 1;

            function add(){

                a++;

            }

            function print(){

                console.log(a);

            }

            return {add,print}

        })();

        var add = fn.add;

        var print = fn.print;

        add();

        print();  //2

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    暴露内部函数的方法一:通过全局对象 window 将内部函数暴露出来

      (function(){

          var a = 1;

          function add(){

              a++;

          }

          function print(){

              console.log(a);

          }

          window.fn={add,print}

      })();

      var add = fn.add;

      var print = fn.print;

      add();

      print();

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    文章最后发布于: 2019-11-16

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/btxmictx.html