【问题标题】:JS garbage collecting with nested functions [duplicate]带有嵌套函数的JS垃圾收集[重复]
【发布时间】:2021-04-15 07:36:11
【问题描述】:

我想知道垃圾收集如何与函数一起工作。对于对象,引用非常简单,很容易形成一棵树。函数也是一样的吗?例如:

(function() {
  let b = 2;
  let c = 3;
  window.a = function() {
    console.log(b + c);
  }
})();

a(); //prints 5

在这种情况下,b 和 c 没有被垃圾回收,因为 a 有对它们的引用?这是真的吗?

【问题讨论】:

    标签: javascript garbage-collection


    【解决方案1】:

    根据规范,函数对象拥有一个指向周围环境记录的内部属性,这是存储变量值的地方。引擎如何在内存中表示它取决于引擎,但只要可以访问函数对象,就必须知道环境记录,因此它不能用于垃圾回收。

    在这种情况下,b 和 c 没有被垃圾回收,因为 a 有对它们的引用?这是真的吗?

    假设引擎实际上代表堆上的环境记录并进行垃圾收集(这两个都是非常合理的假设)是的。

    在某些条件下,例如如果一个变量没有被访问或者是一个常量,那么引擎可能会优化不存储变量的值:

     function unoptimized() {
       const unchanged = 1;
       let unused = 0;
       return () => unchanged;
     }
    
     /* could be optimized to (very simplified) */
    const _inner = () => 1;
    function optimized() { return _inner; }
       
    

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 1970-01-01
      • 2012-03-16
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多