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

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/caoshufang/p/11487422.html
Copyright © 2011-2022 走看看