您所在的位置:小祥子 » 编程 » JavaScript » 正文

JS闭包

时间:2015-07-25 编辑:likelooker 来源:CnBlogs

一、闭包的概念:

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因此这些变量也是该表达式的一部分。用通俗的话来说,JS中的所有function都是一个闭包,但嵌套的function产生的闭包更为强大,这也是大部分时候我们所谓的闭包。

二、闭包的微观世界:

要深入理解闭包以及函数a和嵌套函数b的关系,我们需要了解函数执行环境(excution content)、活动对象(call object)、作用域(scope)和作用域链(scope chain)的概念。以函数a从定义到执行的过程为例来阐述这几个概念:

当定义函数a的时候,JS解释器会将函数a的作用域链设置为“定义a时a所在的环境”,如果a是一个全局函数,则作用域链中只有window对象;

当执行函数a时,a会进入相应的执行环境;

在创建执行环境的过程中,首先会为函数啊添加一个scope属性,即a的作用域,其值就是第一步中的作用域链,即a.scope=a的作用域链;

然后执行环境会创建一个活动对象。活动对象也拥有一个属性对象,但它不具有原型而且不能通过JavaScript直接访问。创建完活动对象后,把活动对象添加到a的作用域链的最顶端。此时a的作用域链包含两个对象:a的活动对象和window对象;

下一步是在活动对象上添加一个arguments属性,它保存着调用函数a时所传递的参数。

最后把所有函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中,完成了函数b的定义,因此如同第三步,函数b的作用域链被设置为b所被定义的环境,即a的作用域。

到此,整个函数a从定义到执行的步骤就完成了。此时a返回函数b的引用给c,又函数b的作用域链包含了对函数a的活动对象的引用,也就是说b可以访问到a中定义的所有变量和函数。函数b被c引用,函数b有依赖于函数a,因此函数a在返回后不会被GC收购。

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" border="0" onload="return imgzoom(this,600);"/>

三、闭包函数的作用:

1.匿名执行函数

我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象会有很多坏处,比如:别的变量可能会无用这些变量,造成全局对象过于庞大,影响访问速度(因为变量的取值需要从原型链上遍历)。

除了每次使用变量都用var关键字外,我们在实际的使用情况中也会遇到这样一种情况,即有的函数只执行一次,其内部变量无需维护。比如UI的初始化,我们可以使用闭包:

var datamodel = {    
    table : [],    
    tree : {}    
};    
     
(function(dm){    
    for(var i = 0; i < dm.table.rows; i++){    
       var row = dm.table.rows[i];    
       for(var j = 0; j < row.cells; i++){    
           drawCell(i, j);    
       }    
    }    
       
    //build dm.tree      
})(datamodel); 

 上诉代码中创建了一个匿名函数,并立即执行,由于外部无法引用它的内部变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。

2.缓存

如果我们有一个处理过程很耗时的函数对象,每次调用都需要花费很长时间,那么我们就会将计算出来的值存储起来,当调用这个函数的时候,首先在缓存中查找,如果找不到,则进行计算,然后更新缓存并返回值,如果找到了,直接返回查找到的值即可。闭包正是可以做到这一点,因此它不会释放外部的引用,从而函数内部的值可以得到保留。

    var CachedSearchBox = (function(){    
        var cache = {},    
           count = [];    
        return {    
           attachSearchBox : function(dsid){    
               if(dsid in cache){//如果结果在缓存中    
                  return cache[dsid];//直接返回缓存中的对象    
               }    
               var fsb = new uikit.webctrl.SearchBox(dsid);//新建    
               cache[dsid] = fsb;//更新缓存    
               if(count.length > 100){//保正缓存的大小<=100    
                  delete cache[count.shift()];    
               }    
               return fsb;          
           },    
         
           clearSearchBox : function(dsid){    
               if(dsid in cache){    
                  cache[dsid].clearSelection();      
               }    
           }    
        };    
    })();    
         
    CachedSearchBox.attachSearchBox("input1");    

 这样,当我们第二次调用CachedSearchBox.attachSerachBox(“input1”)的时候,
我们就可以从缓存中取道该对象,而不用再去创建一个新的searchbox对象。

3.实现封装

在函数外部是无法访问其内部变量的,但可以通过闭包的形式来访问。

    var person = function(){    
        //变量作用域为函数内部,外部无法访问    
        var name = "default";       
           
        return {    
           getName : function(){    
               return name;    
           },    
           setName : function(newName){    
               name = newName;    
           }    
        }    
    }();    
         
    print(person.name);//直接访问,结果为undefined    
    print(person.getName());    
    person.setName("abruzzi");    
    print(person.getName());    
       
    得到结果如下:  
       
    undefined  
    default  
    abruzzi  

 4.实现面向对象的对象

传统的对象语言都提供类的模板机制,这样不同的对象(类的实例)拥有独立的成员及状态,互不干涉,虽然JavaScript中没有类这样的机制,但可以通过闭包,我们可以模拟出这样的机制。

    function Person(){    
        var name = "default";       
           
        return {    
           getName : function(){    
               return name;    
           },    
           setName : function(newName){    
               name = newName;    
           }    
        }    
    };    
         
         
    var john = Person();    
    print(john.getName());    
    john.setName("john");    
    print(john.getName());    
         
    var jack = Person();    
    print(jack.getName());    
    jack.setName("jack");    
    print(jack.getName());    
       
    运行结果如下:  
       
    default  
    john  
    default  
    jack  

 上述代码中,john和jack都可以称为是Person这个类的实例,因为这两个实例对name这个成员的访问是独立的,互不影响的。

四、JavaScript的垃圾回收机制

在JavaScript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第三者所引用,那么这两个互相引用的对象也会被回收。

闭包是JavaScript中的高级应用,也是迈向高级JS程序员的必经之路,理解了其解释和运行机制才能写出更为安全和优雅的代码。

关键词: