1

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

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 应该被释放。为什么不释放?还是因为没有垃圾收集而暂时存在?

4

3 回答 3

4

aprinta函数的闭包保持引用。

a在不再引用该printa函数后的一段时间内将被垃圾收集。

于 2012-08-01T17:34:06.140 回答
2

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

于 2012-08-01T17:33:50.493 回答
2

a将始终存在于由 function 创建的闭包之外printaa仍然在 的范围链内printa,因此在没有更多对 的引用之前,它不会被释放(即垃圾收集)printa

然而,垃圾收集因浏览器而异(IE6 有人吗?),所以所有的赌注都押在它何时会被垃圾收集。

于 2012-08-01T17:34:28.130 回答