2014-02-14 85 views
2

函數完成運行後,下面示例(狗)中的變量是否仍然存在?匿名函數中的局部變量是否存在?

(function(){ 
    var dog=1; 
})(); 

這很大程度上是爲了好奇心,儘管它可能在AJAX應用程序中有很多這樣的變量。並不是說備用的重量會打破任何後盾,但是它會非常困擾開發人員,知道他有多餘的變數。另外,這些變量是否有名稱?

+0

是,否;當垃圾收集器查看是否有任何引用對於'''''你稱爲'狗'時,它將找不到並清除它,但在此之前或如果GC算法很差,則內存仍將被使用。如果你的代碼中有很多變量沒有被正確銷燬,那麼就說它有一個「內存泄漏」,但這不會發生在你給出的例子中。 –

+0

不,'var dog'將在函數內部作用域,並在完成時被銷燬。如果你省略了'var'關鍵字,'dog'將會是一個隱式的全局變量,並且事實上會持續下去! – roo2

回答

3

但從垃圾收集點,有匿名的命名功能沒有區別:

function dostuff(){ 
    var dog = {}; 
} 

dostuff(); 

在當您的函數結束時,您的特例dog超出了範圍。由於沒有別的東西指向那個對象,它應該被垃圾收集。

但是,如果有內部函數,那麼一些變量可能會被保存在閉包內部而不會被垃圾收集;

function dostuff(){ 
    var dog = {name:"dog"}; 
    var cat = {name:"cat"}; 

    setInterval(function(){ 
    console.log(dog.name); 
    }, 100); 
} 

在這種情況下,狗在你傳遞給setInterval所以這個參考被保存dostuff退出時,不會被垃圾收集的回調引用。至於cat變量則取決於實現。有些實現會注意到cat沒有在任何內部函數中使用,並會垃圾收集其內容。但是,其他一些實現會將所有變量保存在範圍中,即使其中只有一個用於內部函數。

欲瞭解更多信息,請參閱:How JavaScript closures are garbage collected

相關問題