码迷,mamicode.com
首页 > 其他好文 > 详细

闭包的概念和实例

时间:2015-07-01 23:23:40      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

闭包的概念

什么是闭包呢? 闭包(Closure),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

其实js中,每个函数就是一个闭包。函数和自己的内部定义的变量绑定在一块,组合成的实体就是闭包。只不过在特殊的情况下,即使函数执行完成了,由于某些原因导致函数内部的变量仍然被外界所引用,所以垃圾回收并不释放函数相关的所有内容,而且将函数和必要的变量组成一个闭包的实体,不释放,直到没有外界变量再指向当前的函数的内部的变量那么闭包就会释放掉。

闭包的实例

例1:

    function Persion() {
    var t = {};
    t.name = "itcast";
    t.age = 19;
    return t;
   }

    var p  = new Persion();
   p.age;

  
   function Persion() {
    var ageProp  = 19;
    var nameProp = "flydragon";
    var phone = "110";   //私有变量
    
    function getPhone() {       //定义属性 get 方法
     return phone;
    }

     function setPhone( value ){ //定义属性 set 方法
     phone = value || "";
    }

    var showFun  = function() {
     console.log( nameProp + "  " + ageProp );
    };

    return {
     age  : ageProp,
     name : nameProp,
     show : showFun,
     get_phone : getPhone,
     set_phone : setPhone
    };

}

    var p = new Persion();
   p.show();
   console.log( p.get_phone() );

例2:如何让嵌套函数的父函数访问子函数的内部变量?

function father() {

his.get_age = child();
     function child() {
      var child_value = "child";
      return function() {
       return child_value;
      }

   }

 }

   var f = new father();
    //子函数的早已经执行完毕,但是还能访问到子函数内部的变量值。
    f.get_age();

例3:全局变量(或者外部变量)

   function father() {
     var get_value ;
     function child() {
      var child_value = 199;
      get_value = function() {
       return child_value;
      }
     }
     return {
      get : get_value;
     }
    }

var f = new father();
    f.get();

例4:

function father() {
     this.f_name   = "fater";
     this.childAge = child();
 function child() {
      var c_age = 19;  //私有变量
      return {
       set_age : function ( value ) {
        c_age = value;
       },

get_age : function () {
        return c_age;
          }

        }
      }
    }

var f = new father();
    f.childAge.set_age(188);
    console.log( f.childAge.get_age() );

 

闭包的概念和实例

标签:

原文地址:http://www.cnblogs.com/hsha/p/4614720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!