在函数运行完毕后,下列示例(dog)中的变量是否仍然存在?
(function(){
var dog=1;
})();
这主要是出于好奇心,尽管它在AJAX应用程序中可能会有很多这样的变量。并不是说备用重量会打破任何后盾,但它会让开发人员非常困扰地知道他有剩余的变量。另外,这些变量是否有名称?
答案 0 :(得分: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的回调中引用了dog,因此当dostuff退出时将保留此引用,并且不会对其进行垃圾回收。至于cat
变量,它取决于实现。某些实现会注意到cat
未在任何内部函数中使用,并将垃圾收集其内容。但是,其他一些实现将保存范围内的所有变量,即使在内部函数中只使用其中一个变量也是如此。
答案 1 :(得分:2)
不,var dog
将作用于函数内部,并在完成时销毁。如果您省略了var
关键字,dog
将是一个隐含的全局,并且实际上会持续存在!
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope
函数的私有状态也可以持久化using closures