2012-08-01 78 views
1

这是在闭包内部创建本地对象的代码。Javascript关闭对象生命

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

+0

我的观点是,虽然''打印''提到''a'',它不会在它返回时执行。因此,“printa”不应该保留对“a”的引用,因为它是一个函数,而不是字典。否则它需要保持所有的外部变量甚至不被执行。 – lcltj 2012-08-01 18:44:29

回答

4

a保持由printa函数的闭包引用。

a在没有更多引用printa函数之后的某段时间将被垃圾回收。

+0

这是否意味着一个函数实际上可以保存里面提到的所有变量,即使不执行它?这使得函数更像一个数组或字典。 – lcltj 2012-08-01 18:36:51

2

存在规则:如果某个变量被某个范围持有,则不是免费的。在您的示例变量a中使用的范围为printa函数。

2

a将始终存在于由函数printa创建的闭包之外。 a仍然是printa范围内链,因此它没有被释放(即垃圾回收),直到有到printa

不再引用但是垃圾收集从浏览器变化到浏览器(IE6的人?),所以所有的赌注确切地说它什么时候会完全被垃圾收集。