闭包为什么会造成内存泄漏

内存泄漏会对浏览器造成很大的压力,之前隐隐约约有听说过“如果闭包不处理是一定存内存泄漏的”,这是真的吗?是为什么呢?

函数作用域链

  1. 创建函数outerFun()时,会创建一个预先包含全局变量对象的作用域链,保存在内部的[[Scope]]属性中。

  2. 调用函数outerFun()时,为此函数创建一个执行环境。

  3. 然后复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。

  4. 此后,创建一个活动对象,推入执行环境作用域链的前端([0]位置)。

此时执行环境的作用域链中包含两个变量对象:全局变量对象(第3步) 、 局部活动对象(第4步)。

函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量。

函数执行完后,局部活动对象被销毁,内存中仅保存全局作用域。

一、什么是闭包

1、父函数里面嵌套的子函数,子函数访问父函数的局部变量。
2、通过return将子函数暴露到全局作用域,子函数就形成闭包。
3、通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用 ,但同时,这个局部变量也不会被全局变量污染。

二、简单的闭包

function addNum() {
    var num = 0;
    return function () {
        num++
        console.log(num);
    };
}
addNum()();//1

三、关于闭包的内存泄漏

常见闭包

内部函数 被 外部函数 包含时,内部函数 会将 外部函数 的局部活动对象添加到自己的作用域链中。而由于 内部匿名函数 的作用域链 在引用 外部包含函数 的活动对象 ,即使addNum执行完毕了,它的活动对象还是不会被销毁!

即,addNum的执行环境作用域链都销毁了,它的活动对象还在内存中留着呢。

并且根据垃圾回收机制,被另一个作用域引用的变量不会被回收。

所以,除非内部的匿名函数解除对活动变量的引用(解除对匿名函数的引用),才可以释放内存。
*老浏览器(主要是IE6)由于垃圾回收有问题导致很容易出现内存泄漏,现在的主流浏览器已经不会发生这种问题。


// 创建函数 还未调用
var creatFun = addNum()
// 调用函数
var result = creatFun()
// 解除对匿名函数的引用
creatFun = null
循环引用

许多人对闭包和内存泄露的关系有误解,认为闭包一定会引起内存泄漏,其实是不对的,我来谈谈我对他们关系的理解。闭包和内存泄露有关系的地方是,使用闭包的同时比较容易形成循环引用,如果闭包的作用域链中保存着一些DOM节点,这时候就有可能造成内存泄露。这主要是程序员容易引起的bug,不是浏览器的问题。
如果要解决循环引用带来的内存泄露问题,我们只需要把循环引用中的变量设为null即可。将变量设置为null意味着切断变量与它此前引用的值之间的连接。当垃圾收集器下次运行时,就会删除这些值并回收它们占用的内存。

比如:

function  showId() {
    var el = document.getElementById("app")
    el.onclick = function(){
      console.log(el.id) // 这样会导致闭包引用外层的el,当执行完showId后,el无法释放
    }
}

// 改成下面
function  showId() {
    var el = document.getElementById("app")
    var id  = el.id
    el.onclick = function(){
      console.log(id) // 这样会导致闭包引用外层的el,当执行完showId后,el无法释放
    }
    el = null    // 主动释放el
}

参考文档[1]:https://blog.csdn.net/qq_44991493/article/details/116133386

参考文档[2]:https://blog.csdn.net/kk211814/article/details/88323872

背景描述随着我国“双碳”战略的推进,电动汽车(EV)已全面普及。截至 2025年,全国电动汽车保有量突破2亿辆,占汽车总量的40%。充电需求激增带来的电网冲击问题日益凸显: 1.家庭充电桩利用率低:私家充电桩日均使用时长不足2 小时,大量时间闲置; 公共快充桩分布不均:部分区域高峰时段充电排队超1小时,而低谷时段设备闲置; 2.电网负荷波动剧烈:快充桩功率可达120kW以上,瞬时负荷波动导致电网峰谷差扩大,对电网稳定性造成威胁,不同于传统燃油车通过油库储存燃料,电动汽车充电需依赖实时电力供应。如何建立数学建模对现状进行描述,由此优化充电桩资源利用效率,同时保障电网安全,成为目前亟待解决的关键问题。本方案针对2025年江西省数学建模A题,提供高质量成品文章、完整解题代码及所有结果表。内容涵盖Python版本代码、Word论文文档无水印(Word版本),并包含详细思路解析,助力参赛队伍高效完成比赛,冲刺高奖项。【核心内容】成品文章包含完整解题思路、模型构建、数据分析与结果讨论。格式规范,符合竞赛论文要求,可直接提交或稍作修改使用。完整代码提供Python和MATLAB语言实现,覆盖数据处理、模型训练、结果可视化全流程。代码模块化设计,注释清晰,便于理解与二次开发。结果表格所有实验数据与结果均已整理成表,直观展示模型性能与对比分析。提供一键转换工具,方便用户根据需求调整论文格式。【产品优势】高效实用:成品论文与代码已通过严格测试,确保结果准确且可复现。全面覆盖:从思路解析到最终成果,一站式解决参赛需求。灵活便捷:支持多平台使用,网盘直发,后续更新免费获取。【适用人群】希望快速掌握解题思路与实现方法的学习者。需要高质量参考材料的科研爱好者。【交付清单】成品论文(Word)Python代码包数据集与结果表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值