函數完成運行後,下面示例(狗)中的變量是否仍然存在?匿名函數中的局部變量是否存在?
(function(){
var dog=1;
})();
這很大程度上是爲了好奇心,儘管它可能在AJAX應用程序中有很多這樣的變量。並不是說備用的重量會打破任何後盾,但是它會非常困擾開發人員,知道他有多餘的變數。另外,這些變量是否有名稱?
函數完成運行後,下面示例(狗)中的變量是否仍然存在?匿名函數中的局部變量是否存在?
(function(){
var dog=1;
})();
這很大程度上是爲了好奇心,儘管它可能在AJAX應用程序中有很多這樣的變量。並不是說備用的重量會打破任何後盾,但是它會非常困擾開發人員,知道他有多餘的變數。另外,這些變量是否有名稱?
但從垃圾收集點,有匿名的命名功能沒有區別:
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
否,var dog
將在函數內部作用域,並在完成時被銷燬。如果您省略了var
關鍵字,dog
將會是一個隱式的全局,並且實際上會持續!
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope
功能的私有狀態還可以堅持using closures
是,否;當垃圾收集器查看是否有任何引用對於'''''你稱爲'狗'時,它將找不到並清除它,但在此之前或如果GC算法很差,則內存仍將被使用。如果你的代碼中有很多變量沒有被正確銷燬,那麼就說它有一個「內存泄漏」,但這不會發生在你給出的例子中。 –
不,'var dog'將在函數內部作用域,並在完成時被銷燬。如果你省略了'var'關鍵字,'dog'將會是一個隱式的全局變量,並且事實上會持續下去! – roo2