这是在闭包内创建本地对象的代码。
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 :(得分:4)
a
由printa
函数的闭包引用。
a
函数的更多引用之后, printa
将被垃圾收集。
答案 1 :(得分:2)
有一条规则:如果某个变量由某个范围持有,那么它不是免费的。在您的示例中,变量a
由printa
函数的范围使用。
答案 2 :(得分:2)
a
将始终存在于函数printa
创建的闭包之外。 a
仍在printa
的范围链内,因此在没有对printa
然而垃圾收集因浏览器而异(IE6任何人都有?),所以所有的赌注都会完全被垃圾收集。