2014-02-14 44 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

相关问题