您的位置:首页 > Web前端 > JavaScript

关于JS-闭包概念的好文章

2015-06-24 11:44 411 查看
读书笔记:

1、闭包使用动机:

1):将函数的内部变量暴露出来;

2):将函数内部变量驻留在内存中。

2、闭包使用方式:

1)使用函数体内部的全局变量和匿名函数

function Obj(){
        var vars = [];
        //addVar是函数体内的全局变量,匿名方法是闭包(其引用了Obj()方法中的临时变量vars)
        addVar = function(newVar){
            vars.push(newVar);
        }
        //readVars是函数体内的全局变量,匿名方法是闭包(其引用了Obj()方法中的临时变量vars)
        readVars = function(){
            alert(vars);
        }
            }
    //Obj()调用后,会初始化函数体内的全局变量addVar和readVars
    Obj();
    addVar("1");
    addVar("esdsdg");
    readVars();//显示1,esdsdg
    addVar("fdsafadsf");
    readVars();//显示1,esdsdg,fdsafadsf
    /*
     总结:
     在全局变量addVar和readVars初始化后,因为addVar和readVars引用了闭包(匿名方法),而
     而匿名方法又引用了Obj()方法体内的临时变量。所以,在全局变量addVar和readVars不释放前,Obj()将
     不会释放并且临时变量vars将一直驻留在内存中。
     */


2)将内部函数作为返回值,将内部函数(闭包)暴露

function newObj(){
        var vars = [];
        //闭包addVar,引用了vars
        function addVar(newVar){
            vars.push(newVar);
            alert(vars);
        }
        //通过返回值的方式将闭包函数暴露
        return addVar;
    }
    //objRef引用了闭包函数addVar()
    var objRef = newObj();
    objRef("t1");//t1
    objRef("t2");//t1,t2
    /*
     总结:
     1、函数通过返回值的方式将闭包函数暴露;
     2、bjRef引用了闭包函数addVar(),闭包函数使用newObj()函数中的临时变量vars
     3、在bjRef不释放的情况下,newObj()不会被释放
     */


3、引用关系为3个+的时候,对象才不会释放,或者会被回收机制回收。

好文推荐:
http://www.jb51.net/article/24101.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: