2012-08-01 66 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的人?),所以所有的賭注確切地說它什麼時候會完全被垃圾收集。