zoukankan      html  css  js  c++  java
  • 闭包理解

    1、首先解释下闭包是什么,闭包就是指有权访问另一个函数作用域中的变量的函数。一般就是在一个函数里面创建另一个函数,比如:

          function createCompareFunction(propertyName) { 
              return function (obj1, obj2) { 
                  var value1 = obj1[propertyName];
                  var value2 = obj2[propertyName];
                  
                  if (value1 < value2) {
                      return -1;
                  } else if (value1 > value2) {
                      return 1;
                  } else {
                      return 0;
                  }
               }
           }
           var compareName = createCompareFunction('name')
           var result = compareName({name: 'xxx'}, {name: 'kkk'})
           console.log(result); // 1
        // 解除对匿名函数的引用,释放内存
        compareName = null
     

    通过是上面的代码我们可以看出,匿名函数可以访问createCompareFunction里的变量,那为什么呢?原因是:匿名函数作用域链里包括了createCompareFunction的活动对象

    2、闭包会携带包含它函数的作用域,所以闭包会比其他函数占用更多的内存

    过度使用闭包会导致内存占有过多,除非绝对必要,否则不要轻易使用闭包。

    3、闭包只能取得包含函数内任何变量的最后一个值

    因为闭包保存的是整个变量对象。

    4、内存泄漏

    如果闭包作用域链中保存着一个HTML元素,那么意味着该元素无法被销毁

    function assignHandler() { 
            var element = document.getElementById('someElement');
            element.onclick = function () { 
                alert(element.id);
             }
             console.log(element);
           }
           var assignFunc = assignHandler();

    element是assignHandler()活动对象,而闭包的作用域链则保存了它,只要匿名函数在,element的引用数就至少是1.

    但是可以在assignHandler加这一句就可以解决:element = null

  • 相关阅读:
    opencv7-ml之KNN
    opencv7-ml之统计模型
    计算机视觉-sift(2)代码理解
    计算机视觉-sift(1)原理
    PRML2-概率分布
    如何高效的通过BP算法来训练CNN
    CPP2-基础部分(1)
    PRML5-神经网络(2)
    《机器学习系统设计》(2)
    《机器学习系统设计》(1)
  • 原文地址:https://www.cnblogs.com/caoshufang/p/11487422.html
Copyright © 2011-2022 走看看