【问题标题】:Creating and returning object from function: can this avoid garbage collection?从函数创建和返回对象:这可以避免垃圾收集吗?
【发布时间】:2015-05-29 06:51:20
【问题描述】:

如果我有一个创建对象的函数,做一些事情然后返回它。如果对象确实是通过引用传递的,这是否意味着创建对象的函数(或函数的作用域链)将不可用于垃圾回收?

示例代码:

function convertArrayToObj(array){
   var newObj = {};
   array.forEach(function(item, index){
      newObj[index] = item;
   });
   return newObj;
}

我希望我把我的疑问说清楚了

【问题讨论】:

  • 不,该范围将可用于垃圾,函数执行结束后没有对其保留的引用。该对象独立于其创建范围。你可能会对闭包感到困惑。

标签: javascript object scope garbage-collection return-by-reference


【解决方案1】:

它(执行上下文)将有资格进行垃圾回收。

(函数对象本身将被调用它的人保持活动状态,直到该对象死亡 - 但它不会被返回的“newObj”保持活动状态。)

仅仅因为对对象的引用存储在局部变量中并不意味着该对象已经获得了对其创建者的引用。

【讨论】:

  • 谢谢!所以返回对象的函数将被垃圾收集,但返回返回对象的函数(在“外部”函数范围内创建)不会(因为它是一个闭包)?我说的对吗?
  • “一个函数”涉及两个对象。函数对象本身,以及调用该函数时创建的执行上下文。函数对象保留对创建时执行上下文的引用,因此如果您“返回一个函数”,您将返回一个对象,该对象具有对创建时执行上下文的引用 - 并且父上下文将只要返回的函数对象还活着,就一直保持活着。您可以将执行上下文视为调用堆栈帧,但它们存储在堆上,因此不会在返回时销毁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多