闭包

2019-11-17  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读