zoukankan      html  css  js  c++  java
  • JavaScript--浅谈闭包

    闭包通常用来创建内部变量,使得这些变量不能被外部随意修改,同时又可以通过指定的函数接口来操作。

    类似于面向对象中 的构造器,通过闭包实现 private 和 public 变量的声明。

    (1)、使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
    (2)、闭包有三个特性:
    a、函数嵌套函数
    b、函数内部可以引用外部的参数和变量
    c、参数和变量不会被垃圾回收机制回收

    作用域就不说了,先来理解一个概念:作用域链

    当定义一个函数时,它实际上保存一个作用域链。

    当调用这个函数时,它创建一个新的对象来存储他的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的‘链’。

    下面来举个栗子:

     var scope = 'G scope';
    function checkscope(){
              var scope = 'L Scope';
              function f(){
                          return scope;
                             }
              return f();
     }
    checkscope();  //   ‘L Scope’



    var scope = 'G scope';
    function checkscope(){
              var scope = 'L Scope';
              function f(){
                          return scope;
                             }
              return f;
     }
    checkscope()(); //  'L Scope'
    简单来说, 定义  f  时候生成 的 作用域链保存了当前作用域的所有对象,包括 var scope = ‘L Scope’;  这个局部变量。
     
    函数定义时的作用域链到函数执行时依然有效。这句话就是闭包的精髓了。
    引用阮一峰的话,闭包可以用在许多地方。它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
     
    如何读取函数内部的变量呢?看下面你就知道了:

    function f1(){

        var n=999;

        function f2(){
          alert(n); 
        }

        return f2;

      }

      var result=f1();

      result(); // 999

    如何让这些变量的值始终保持在内存中呢?

    function f1(){     

      var n=999;     

      nAdd=function(){n+=1}     

      function f2(){       

        alert(n);     

      }     

      return f2;   

    }   

      var result=f1();   

      result(); // 999   

      nAdd();   

      result(); // 1000

          result = null;//销毁匿名函数,闭包所包含的活动对象也就一起释放了

          var result=f1();   

      result(); // 999   

    函数作为返回值时,连同函数定义时的环境(包括函数外部,函数可以访问到的变量)一起返回,确保这些变量不因其依附的对象销毁而被销毁。

    这就是闭包的作用。

  • 相关阅读:
    用Lua编写ACM算法竞赛开灯问题
    糟糕的中文版龙书
    font and face, 浅探Emacs字体选择机制及部分记录
    栈与卡特兰数
    关于2018年东南大学Robomaster算法组工作的总结
    C++中的默认参数规则
    MySQL第三章——嵌套查询
    MySQL第三章——空值的处理
    MySQL第三章——数据更新
    MySQL第三章——连接查询
  • 原文地址:https://www.cnblogs.com/zwhblog/p/7279099.html
Copyright © 2011-2022 走看看