闭包

闭包 :
           函数定义时,保存其作用域中的变量
           利用函数作用域的特性,函数内部可以访问函数外部(上一层作用域)的变量
 
闭包的意义:
              在于 在非函数创建的位置,访问函数创建位置的变量
 
闭包的作用:
     1.变量的声明周期 (延长局部变量的生命周期)
     2.变量的作用域 (封装私有变量)
 
作用域的注意点:
          1.每个函数都有自身的this ,arguments,无法访问外层函数作用域中的。
          2. 闭包函数执行时,参数或局部变量会覆盖闭包引用的变量  
          3.闭包引用变量时,保存的是引用。 引用的值(基本类型)可能在外部发生变化,如果需要将变量的值作为常量,需要将           引用转化为值时, 利用 call-by-shall 特性
          思路:引用——》传入自执行匿名函数——>传参特性——》值
 
 
 
 
  
闭包与对象的比较
层叠
     1.闭包: 在过程中以环境的形式包含了数据
     2.对象: 以方法的形式包含了过程
 
面向对象与函数式比较: 一个以数据为中心 一个以函数为中心   一个用数据包含函数  一个以函数的形式包裹数据
 
一般对象中只含有一个方法,就闭包替代比较合适。 有多个方法时,用面向对象组织代码结构比较合适
 
面向对象可以实现的功能,函数式也可以实现。只是实现的角度的不同
 
性能比较
闭包:实例化速度慢,调用速度快
对象:实例化速度快,调用速度慢
 
******************************************************************************************************************
对闭包的误解:当需要延长一个变量的生命周期时,使用闭包,不应该被认为是浪费内存。其他方式也是讲变量保存在内存中
闭包和内存泄露
   IE bug:循环引用, 引用计数策略无正确处理循环引用。 
       1.两个对象相互引用
       2.DOM事件处理函数引用了DOM节点(也是循环引用) 
           function foo(element, a, b) {
                           element.onclick = function() { /* uses a and b */ };
                    }   
        解决方法:
           function foo(element, a, b) {
                      element.onclick = bar(a, b);
                    }

                    function bar(a, b) {
                       return function() { /* uses a and b */ }
                    }   
   
 
posted @ 2016-09-03 16:38  阿巴阿巴55996  阅读(74)  评论(0)    收藏  举报