JS中的堆栈内存及函数底层处理机制(4)

本文介绍了JavaScript中的闭包和浏览器的垃圾回收机制。闭包是一种函数特性,它可以保护内部变量并允许在函数执行后仍然访问。在栈内存中,函数执行后的上下文通常会被释放,但闭包会导致某些私有上下文不被释放。而在堆内存中,通过引用计数或标记清除策略进行垃圾回收。理解这些概念对于避免内存泄漏和优化JavaScript应用性能至关重要。
摘要由CSDN通过智能技术生成

闭包及浏览器垃圾回收机制

GC(Garbage Collection)

GC => 浏览器的垃圾回收机制(内存释放机制)

  • 栈内存释放

    • 加载页面,形成一个全局的上下文,页面关闭后,全局上下文才会被释放
    • 函数执行会形成一个私有的上下文,进栈执行;当函数执行完毕,大部分情况下,形成的上下文都会被出栈释放掉,以此来优化栈内存大小
    • 特殊情况例子:
    function fn() {
      var a = 100;
      return function () {
        console.log('Patrick Huang');
      }
    }
    var f = fn();
    f();
    

    此时,全局变量 f 关联私有上下文中创建的函数堆,此私有上下文不会被释放

  • 堆内存释放

    1. 查找引用(谷歌浏览器)
      • 浏览器在空闲或指定时间内,查看所有的堆内存,把没有被任何东西占有的堆内存释放掉
      • 占用的堆内存是不被释放的
    2. 引用计数(IE)
      • 创建了堆内存,被占用以此,浏览器计数 +1,取消占用计数 -1
      • 记录的数字为 0 时,释放此堆内存
      • 某些情况会导致计数混乱,出现内存泄漏

闭包(Closure)

  • 函数执行,会形成一个私用上下文:
    • 里面的私有变量,收到私有上下文的保护,不受外界干扰
    • 有可能形成不被释放的上下文,里面的私有变量和一些值,就会被保存起来,这些值可以供其下级上下文使用

以上所述函数的这种保存保护机制,我们称之为闭包(Closure)

下一章会举几个例子,这一章就先给出定义

新的例子图解:
从一个例子图解彻底了解闭包机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值