JS中闭包作用域和垃圾回收处理~

669 阅读1分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

堆内存释放问题:如果当前的堆被占用了【地址被引用,则不能释放,如果不被引用,浏览器会在空闲的时候释放它】

GC:浏览器的垃圾【内存】回收机制

  •     引用计数【被占用一次计数累加1,当取消应用再减去1,当减到零,会把其释放】
  •     引用检测/标记清除【被占用后做一个标记,当移除引用,取消标记,在浏览器空闲的时候,会把所有未标记的内存回收】

null[空对象指针,不开辟任何的位置]

请看下面这个例子 前端一定要学会画这种图,协助我么能清晰地理解分析题目~主要是闭包相关的以及内存的释放

图片.png

// EC(G)
//  x=10
//  fn = 0x000 [[scope]:EC(G)]

let x= 10;
function fn() {
    // EC(FN) 闭包
    //  y = 20
    //  f=0x001[[scope]:EC(FN)]
    let y = 20;
    function f() {
        console.log(y)
    }
    window.f = f;
}
fn();
fn = null// 把0x000堆释放掉,但是之前形成上下文不受影响
f(); // ->20
window.f = null //把0x001堆释放掉,此时EC(FN)中没有被外面占用的内容了,它也被释放掉

图片.png