现在的位置: 首页 > 综合 > 正文

27-JavaScript-面向对象-闭包

2014年09月05日 ⁄ 综合 ⁄ 共 724字 ⁄ 字号 评论关闭

闭包

1. 什么是闭包(closure)

    
    JavaScript闭包就是在另一个作用域中
    保存了一份它从上一级函数或作用域取得的变量(键值对),
    而这些键值对是不会随上一级函数的执行完毕而销毁的.

2. 举例

    function funcA() {

        var x = 0;

        function funcB() { 
            alert( ++x );
        }

        return funcB;
    }

    var funcC = funcA();

    funcC();

3. 分析


    在执行完 " var funcC = funcA(); " 后,
    变量 funcC 指向了函数 funcB.
    funcB中用到了 funcA中的 变量x.
    执行 funcC() 后, 会弹出对话框(x的值为1).
    这段代码就创建了一个闭包.
    因为函数funcA外的变量funcC引用了函数funcA内的函数funcB.
    即, 
     当函数funcA的内部函数funcB 被函数funcA外的变量引用时,
     就闯进了一个所谓的"闭包".

4. 闭包的作用     


    在 函数funcA执行完毕后, 
    闭包使得JS的GC不会回收funcA所占的资源,
    因为funcA的内部函数funcB的执行需要依赖funcA中的变量.

5. 综上


 1) 闭包与gc相关    
 2) 闭包涉及到一个对象的属性 何时被gc处理
 3) 如何对对象的属性形成闭包, 
    即保护对象的属性在对象没用引用指向后, 不被销毁

    function funcA() {

        var x = 0;

        function funcB() { 
            alert( ++x );
        }

        return funcB;
    }

    funcA();    // 此句结束后, 对象即可被回收, 属性x即可被销毁

    var funcC = funcA(); 
    // 不会销毁对象, 因为funcC可能会用到对象的属性 

    funcC();   

抱歉!评论已关闭.