闭包理解

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

posted @ 2019-09-08 17:16  Sofiaღ  阅读(260)  评论(0编辑  收藏  举报