匿名函数中的局部变量是否仍然存在?

时间:2014-02-14 00:36:43

标签: javascript ajax

在函数运行完毕后,下列示例(dog)中的变量是否仍然存在?

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

这主要是出于好奇心,尽管它在AJAX应用程序中可能会有很多这样的变量。并不是说备用重量会打破任何后盾,但它会让开发人员非常困扰地知道他有剩余的变量。另外,这些变量是否有名称?

2 个答案:

答案 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未在任何内部函数中使用,并将垃圾收集其内容。但是,其他一些实现将保存范围内的所有变量,即使在内部函数中只使用其中一个变量也是如此。

有关详细信息,请参阅:How JavaScript closures are garbage collected

答案 1 :(得分:2)

不,var dog将作用于函数内部,并在完成时销毁。如果您省略了var关键字,dog将是一个隐含的全局,并且实际上会持续存在!

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope

函数的私有状态也可以持久化using closures