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

  • 相关阅读:
    etcd客户端c#
    【Python 2 到 3 系列】 关于除法的余数
    彻底搞定C指针--“函数名与函数指针”
    关于 函数指针和函数名 例子的疑难解答
    stat.h头文件,轻松获取文件属性
    C++指针之间的赋值与转换规则总结
    (转)mblog解读(二)
    (转)mblog解读(一)
    (转)renren-fast解读(二)
    (转)renren-fast解读(一)
  • 原文地址:https://www.cnblogs.com/yuan001/p/3683261.html
Copyright © 2011-2022 走看看