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; }