zoukankan      html  css  js  c++  java
  • 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

    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++);他的值。

  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/yuan001/p/3683261.html
Copyright © 2011-2022 走看看