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

  • 相关阅读:
    Python金融量化分析小白入门篇之如何安装Tushare模块
    InvalidSpecError: Invalid spec: =2.7报错解决办法
    windows10安装集成环境wampserver,刚开始可以用图标是绿色的,但是过一段时间,启动后呈橙色,重启也不行
    Java代码写完如何打包成程序?.jar包如何转成.exe文件?
    C#通过虚方法实现多态性,具体要求如下:1、创建基类Cuboid(长方体)及带有三个参数(长、宽、高)的构造函数。2、使用virtual关键字创建Cuboid类的Cubage()方法(虚方法)。3、创建Cuboid类的派生类Cube(正方体),并使用override关键字创建与Cuboid类中同名的Cubage()方法,实现多态。
    用C#设计两个类,一个描述点,另一个描述圆。圆由圆心和半径构成,圆类由点类派生而来,其中圆心的特性描述由点类继承下来。要求:圆类提供求圆面积的成员函数;支持初始化的带参构造函数;取得圆心坐标的两个函数。
    C#程序填空题,根据注释内容,填补程序空白部分。
    在C#中readonly成员:判断对错。
    毕业设计第四次任务书
    毕业设计第三次任务书
  • 原文地址:https://www.cnblogs.com/yuan001/p/3683261.html
Copyright © 2011-2022 走看看