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

  • 相关阅读:
    数据挖掘相关资料收集(持续更新)
    常见面试之机器学习算法思想简单梳理
    在c中保存状态
    lua 和 c
    lua 基础库
    lua 面向对象
    lua 高级
    lua 基础
    lua中的协程
    cocos2d中的可见性检测
  • 原文地址:https://www.cnblogs.com/caoshufang/p/11487422.html
Copyright © 2011-2022 走看看