javascript 高级 闭包

闭包从smalltalk开始,几乎所有知名动态语言都支持闭包,javascript也不例外。

 

  • 闭包的定义非常晦涩——闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)
  • 闭包与函数的关系就好像动态与静态,结构与实例的关系。javascript中闭包是通过function实现的
  • 闭包的“闭”指闭包的内部环境对外部的不可见,简单地说,即闭包的领域是对外封闭的。
  • 我通常认为闭包是一种引用结构,至少在javascript中是这样的,javascript中的闭包(closure),也可以理解为一种“函数实例引用”(function instance referer).

通俗理解:闭包就是能够读取其他函数内部变量的函数。

 

(function(){
    function makefunc(x){
        return function(){return x};
    }
    var a = [makefunc(0),makefunc(1),makefunc(2)];
    
    alert(a[0]());
    alert(a[1]());
    alert(a[2]());
})();
// a数组中,三个保存的函数虽然外观一样,但是其都拥有的不同调用对象,调用对象中的x属性不同,

 

  

(function(){
    function createFunctions(){
        var result = new Array();
        
        for(var i=0;i<10;i++){
            result[i] = function(){
                return i;    
            };
        }
        
        return result;
    }
    
    var funcs = createFunctions();
    
    for(var i=0;i<10;i++){
        document.write(funcs[i]()+"<br>");
    } //输出都为十
    
})();
//createFunctions中返回的函数保存在result数组中,函数引用的i变量为同一个调用对象createFunctions执行下的局部变量i,即调用对象中保存的i属性,程序执行结束i的值都为10,因而返回的都为10

 

 

我们说,javascript的对象中的私有属性其实就是环境中的非持久变量。

 

缺点:闭包最大特点是可以访问其他函数内部变量,这使得程序太过灵活,可能为程序引入额外的复杂度。

由于闭包的调用对象被闭包引用,所以返回了闭包的调用对象在函数调用结束后,并没有马上销毁,如果程序中存在大量闭包,忘记销毁他们,可能致使程序内存剧增。

posted @ 2012-06-27 15:09  zzu-han  阅读(209)  评论(0编辑  收藏  举报