Javascript 使用嵌套函数进行JS垃圾收集

Javascript 使用嵌套函数进行JS垃圾收集,javascript,garbage-collection,Javascript,Garbage Collection,我想知道垃圾收集是如何使用函数的。对于对象,引用非常简单,很容易形成树。函数也是这样吗?例如: (function() { let b = 2; let c = 3; window.a = function() { console.log(b + c); } })(); a(); //prints 5 在这种情况下,b和c不会被垃圾收集,因为a有对它们的引用?这是真的吗?根据规范,函数对象持有指向周围环境记录的内部属性,即存储变量值的位置。引擎在内存中如何表示取决于引

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

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

a(); //prints 5

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

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

在这种情况下,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; }