Javascript关闭对象的生命

时间:2012-08-01 17:31:51

标签: javascript closures

这是在闭包内创建本地对象的代码。

function A() {
    this.welcome = "Welcome";
}

var P = (function() {
    var a = new A();
    function printa() {
        console.log(a);
    }
    return {
        printa: printa
    };
})();


P.printa();

打印:

{ welcome: 'Welcome' }

执行P = ...函数后,P获取一个新对象,该对象保存对函数printa()的引用,但此时应释放局部变量a。为什么没有被释放? 或者它暂时存在,因为它不是垃圾收集?

3 个答案:

答案 0 :(得分:4)

aprinta函数的闭包引用。

在没有对a函数的更多引用之后,

printa将被垃圾收集。

答案 1 :(得分:2)

有一条规则:如果某个变量由某个范围持有,那么它不是免费的。在您的示例中,变量aprinta函数的范围使用。

答案 2 :(得分:2)

a将始终存在于函数printa创建的闭包之外。 a仍在printa的范围链内,因此在没有对printa

的引用之前,它不会被释放(即垃圾收集)

然而垃圾收集因浏览器而异(IE6任何人都有?),所以所有的赌注都会完全被垃圾收集。