代码改变世界

js 闭包

2014-04-23 16:50  yuan001  阅读(479)  评论(0编辑  收藏  举报

一、定义

js 闭包 一个函数内部函数引用这个函数,这个函数返回内部函数,这样就产生了闭包

二、应用场景

1)创建私有变量、私有方法

2)在内存中维持一个变量的值

三、弊端

闭包对脚本性能具有负面影响,包括处理速度和内存消耗,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

四、使用案例

1)

   1:         function fun1(){
   2:              var a=5;
   3:              function fun2(){
   4:                  console.log(a++);
   5:              }
   6:              return fun2;
   7:          }
   8:   
   9:          var c = fun1();
  10:          c(); // 5
  11:          c(); // 6

fun1 返回fun2,然后把返回值赋给变量c,fun2又引用fun1的变量a,所以在c执行的时候,c引用fun1,fun1又引用fun2,fun2又引用fun1种的变量,这使垃圾回收器在fun1执行后不能回收,使a变量长期占用内存,所以c执行第二次的时候,a++ 执行了,所以结果是6

2)闭包中的变量是引用而非拷贝

   1:         function say1(){
   2:              var num = 11;
   3:              num++;
   4:              return function()   {
   5:                  return num;
   6:              }
   7:          }
   8:          console.log(say1()()); // 12

3) 多个函数可以引用同一个闭包,say3,say4 是全局变量,当执行完say2的时候 say3,say4被赋值了,所以say3,say4在执行完say2的时候可以直接访问。
   1:          function say2(){
   2:              var num=22;
   3:              say3 = function(){
   4:                  return num;
   5:              }
   6:              say4 = function(x){
   7:                  num = x;
   8:              }
   9:          }
  10:          say2();
  11:          console.log(say3()); // 22
  12:          say4(33);
  13:          console.log(say3()); // 33

 

4)

   1:          /** js 私有变量私有方法 单件模式
   2:           * privateNum 是私有变量 getPrivate() 私有方法
   3:           * sigono通过return来返回对私有变量和私有方法的调用
   4:           * */
   5:          var sigono = (function(){
   6:            var privateNum = 1;
   7:            function getPrivate(x){
   8:                return x;
   9:            }
  10:            return {
  11:                firstMthod : function(){
  12:                    return privateNum;
  13:                },
  14:                secodMethod : function(x){
  15:                    return getPrivate(x);
  16:                }
  17:            }
  18:          }());
  19:   
  20:          console.log(sigono);
  21:   
  22:          console.log(sigono.firstMthod()); // 1
  23:          console.log(sigono.secodMethod(2)); // 2

 

5) 同名函数里面的闭包

   1:        var a = 1;
   2:        function testA(b){
   3:              testA = function(b){
   4:                 alert(a+b++); // 4
   5:              }
   6:              alert(a); // 1
   7:              a++;
   8:              alert(a); // 2
   9:       }
  10:      testA(1);
  11:      testA(2);
testA里面包含testA,在第一次执行的时候,只执行外面的testA,弹出
 alert(a); // 1
   7:              a++;
   8:              alert(a); // 2

然后执行完一遍后,里面的testA会把外面的覆盖掉,第二次再执行里面的testA,这是变量a是函数里面的a,这时a为2,

弹出 alert(a+b++);他的值。