js 闭包

一、定义

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

js 闭包,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。