闭包

作者: 苹果咏 | 来源:发表于2019-09-28 20:36 被阅读0次

    函数和函数内部能访问到的变量的总和,就是一个闭包。
    特点:
    1、能让外部访问函数内部的变量
    2、避免使用全局变量,防止全局变量污染
    3、局部变量会常驻内存中,会造成内存泄漏

    function test(){
      var i=10;
      return function leijai(){
        i++;
        return i;
      }
    }
    var a=test()   //此时a就是里面的leijia函数
    a()    //11
    a()  //12
    a()  //13
    

    i声明在test函数内部,所以test内部的laijia函数也能访问此变量,a是执行test函数,返回的是test函数里的leijia函数


    image.png

    因为JS的回收机制,自动回收不再使用的内存空间,但是闭包会阻止某些回收,因为leijia函数依然持有其所在作用域的引用,所以其内部作用域不会被回收
    a()才是执行leijia函数

    var arr=[]
    undefined
    for(var i=0;i<3;i++){
        arr[i]=function(){
            console.log(i)
        }
    }
    arr[0]()//3
    arr[1]()//3
    arr[2]()//3
    

    函数不调用是不会执行的,这里arr[i]只会执行最后i=3的结果

    var arr = []
        for (var i = 0; i < 3; i++) {
            console.log('i的值是:' + i)
            arr[i] = (function (i) {
                return function(){
                    console.log(i)
                }  
            })(i)
        }
        arr[0]()//0
        arr[1]()//1
        arr[2]()//2
    

    加了立即执行函数,不调用的话输出:


    image.png

    调用后:


    image.png
    闭包的用途:

    1.从外部读取函数内部的变量。

    function f1() {
      var n = 9;
      function f2() {
        console.log(n);
      }
      return f2;
    } 
    var result = f1();
    result(); // 9
    //这段代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。
    

    2.让这些变量始终保持在内存中。

    function f1(n) {
      return function () {
        return n++;
      };
    }
    var a1 = f1(1);
    a1() // 1
    a1() // 2
    a1() // 3
    //这段代码中,闭包使得内部变量记住上一次调用时的运算结果。
    

    3.封装对象的私有属性和私有方法。

    function f1(n) {
      return function () {
        return n++;
      };
    }
    var a1 = f1(1);
    a1() // 1
    a1() // 2
    a1() // 3
    var a2 = f1(5);
    a2() // 5
    a2() // 6
    a2() // 7
    //这段代码中,a1 和 a2 是相互独立的,各自返回自己的私有变量。
    

    相关文章

      网友评论

          本文标题:闭包

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