闭包

作者: RQrry | 来源:发表于2020-04-06 14:01 被阅读0次

    嵌套的内部函数引用外部函数的变量,产生闭包。

    闭包的作用

    1. 可以做缓存(存储结构)
    2. 可以实现封装,属性私有化
    3. 模块化开发,防止污染全局变量

    闭包的缺点

    函数内的局部对象没有被释放,占用内存时间过长
    容易导致内存泄露

    闭包的生命周期

    产生:在嵌套内部函数定义完成后
    死亡:在嵌套内部函数成为垃圾对象时

    闭包的应用

    累加器

    function add() {
        var count = 0;
        function a() {
            console.log(++count);
        }
        return a;
    }
    var counter = add();
    counter(); // 1
    

    模块化开发

    var init = (function () {
      var name = "abc";
      var age = 12;
      function getName() {
        console.log(name);
      }
      function getAge() {
        console.log(age);
      }
      return {
        getName: getName,
        getAge: getAge
      }
    })();
    

    内存溢出和内存泄露

    内存溢出

    • 一种程序运行出现的错误
    • 当程序运行需要的内存超过了剩余内存时,会抛出内存溢出的错误
      内存泄露
    • 占用的内存没有及时被释放
    • 内存泄露积累多了就容易导致内存溢出
    • 常见的内存泄露
      - 意外的全局变量
      - 没有及时清理的计时器或回调函数
      - 闭包

    例题

    var name = 'window';
    var object = {
      name: 'object',
      getName: function () {
        return function () {
          return this.name;
        }
      }
    }
    console.log(object.getName()());
    // window
    
    var name = 'window';
    var object = {
      name: 'object',
      getName: function () {
        var that = this;
        return function () {
          return that.name;
        }
      }
    }
    console.log(object.getName()());
    // object
    
    function fun (n, o) {
      console.log(o);
      return {
        fun: function (m) {
          return fun(m, n);
        }
      }
    }
    var a = fun(0); // undefined
    a.fun(1); // 0
    a.fun(2); // 0
    a.fun(3); // 0
    var b = fun(0).fun(1).fun(2).fun(3); // undefined 0 1 2
    var c = fun(0).fun(1); // undefined 0
    c.fun(2); // 1
    c.fun(3); // 1
    

    相关文章

      网友评论

          本文标题:闭包

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