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

  • 相关阅读:
    Python中if __name__ == '__main__' 的作用和原理
    ajax请求参数为中文乱码的情况
    表单提交---前端页面模拟表单提交(form)
    mysql中函数DISTINCT,group by,CONCAT及GROUP_CONCAT的使用
    Java的反射机制及应用实例
    Java中的IO学习总结
    Form表单提交
    Java中equals和==的区别
    Java的String&StringBuffer&StringBuilder
    Java的Date类与Calendar类
  • 原文地址:https://www.cnblogs.com/yuan001/p/3683261.html
Copyright © 2020-2023  润新知