【问题标题】: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; }