闭包可能导致的内存泄漏

news2024/11/17 22:49:13

什么是闭包

闭包是函数可以保留和访问其外部变量,比如

let a = 1
let b = function() {
	console.log(a)
}

这里变量b指向的函数可以访问外面的变量,你会说这不是废话吗?函数都可以访问外部变量呀
那再看一个例子

function f() {
  let value = 123;

  return function() {
    alert(value);
  }
}

let g = f(); 

这里函数f执行后,value值是不会被回收的,因为变量g有对函数f的返回有个引用,这个返回是个函数,函数里用到了value,这里也是个闭包。
通过闭包可以保留外部变量的特性,可以实现一些功能,比如

function add() {
	let value = 0
	return function(v) {
		value += v
		return value
	}
}
let a = add()
console.log(a(1)) // 1
console.log(a(2)) // 3

闭包造成的内存泄漏

先看看这段代码

let theThing = null;
let replaceThing = function () {
  let leak = theThing;
  let unused = function () {
    if (leak)
      console.log("hi")
  };

  theThing = {
    longStr: new Array(1000000),
    someMethod: function () {
      console.log('a');
    }
  };
};

这里如果replaceThing执行了多次,就会造成内存泄漏。一开始我也没搞懂,这里不就最多同时存在两份大内存吗?就是当次的theThing变量和leak变量指向上次的theThing变量,没有形成一条引用链呀?

你要说someMethod方法里,如果用到了leak,那someMethod有对leak的引用,然后当下次replaceThing执行时,新的leak指向了上次的theThing,上次的theThing的someMethod里又引用了旧的leak,这样就形成了leak->someMethod->leak->someMethod… 的引用链。

通过chrome的devtools的内存分析工具也能看到这个引用链

但someMethod里没有对leak的引用呀?
这里就是闭包形成的内存泄漏,someMethod指向的函数能访问外部变量,这里就包括了leak,哪怕他内部没有用到leak,但他所处的环境却用到了。
在这里插入图片描述
你会说unused都没用到,不是会被引擎优化掉吗?甚至都没这个变量了。
是的unused被优化掉了。
在这里插入图片描述

但函数的定义还是有的,函数里用到leak,所以leak变量没被优化。那这个函数连名字都没用呀,都调用不了,怎么不顺便优化了?

在这里插入图片描述
这里是没理解的,不过这种情况实际上更早就能发现
在这里插入图片描述
ts就报错了。

但浏览器认为leak有用到就说明这个匿名还是还是被定义了,难道是漏优化了?可能之后这个case就不会内存泄漏了。有大佬知道咋回事吗?

参考资料

  1. 变量作用域,闭包
  2. 函数声明提前

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人人都能看懂的Spring源码解析,配置解析与BeanDefinition加载注册

人人都能看懂的Spring源码解析,扫描加载BeanDefinition的过程原理解析什么是BeanDefinition?两种配置方式扫描并读取配置信息,解析成BeanDefinition保存BeanDefinition源码走读xml配置方式整体流程示例代码BeanDefinition加载解析的入口创建X…

机器学习基础

一、基本概念 1 学习的概念 1975年图灵奖获得者、1978年诺贝尔经济学奖获得者、著名学者赫伯特.西蒙 (Herbert Simon) 曾下过一个定义: 如果一个系统,能够通过执行某个过程,就此改进了它的性能,那么这个过程就是学习.由此可看出,…

思科基础组面试(部分)

面了三轮,前面两轮因为录的视频坏了,很多问题忘了。 Round 1 Q:举例说明为什么hashmap线程不安全 A1: JDK1.8 HashMap线程不安全体现在:数据覆盖: 其中第六行代码是判断是否出现hash碰撞,假设两个线程A、B都在进行put操作&#…

软件测试未来发展趋势怎么样

未来,互联网技术是很多企业能够活下去的关键点。互联网技术成为新的基建,互联网“基建”化就决定了软件测试行业的缺口会一直扩大。 并且,软件测试岗位,已不仅局限于互联网企业,现已逐步深入到实体产业,金…

【安全等保】安全等保二级和三级哪个高?哪个费用更高?

等保政策已经严格落地执行了,各大企业纷纷接到了过等保的通知,但有的估计是第一次听到等保,对于等保相关政策都是非常蒙圈的。这不不少企业相关负责人在问,安全等保二级和三级哪个高?哪个费用更高?这里我们…

分布式文件系统使用——MinIO

分布式文件系统使用——MinIO 1 分布式文件系统 1.1 概念 常见的文件系统:FAT16/FAT32、NTFS、HFS、UFS、APFS、XFS、Ext4等 。 现在有个问题,一此短视频平台拥有大量的视频、图片,这些视频文件、图片文件该如何存储呢?如何存储…

04- 根据Xgboost集成算法预测还贷能力 (项目四)

筛选最佳参数: # 对于max_depth和min_child_weight查找最好的参数 param_grid { max_depth:range(3,10,2),min_child_weight:range(1,6,2)}model XGBClassifier(learning_rate 0.1,n_estimators100,max_depth5,use_label_encoderFalse,min_child_weight1,gamma0,subsample0…

状态管理VueX

哈喽~大家好,这篇来看看状态管理VueX。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【专栏】 🥉与这篇相关的文章: SpringCloud Sentinel 使用SpringClou…

java整数转罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为…

低版本jQuery导致XSS Nuclei FUZZ POC

目录 1.前言 2. Nuclei FUZZ jQuery XSS POC 3.漏洞验证 4.修复建议 1.前言 我记得以前用那些漏扫工具时时常会报一个低版本jQuery的安全问题,当时还不会验证。直到有一天,它托梦给我。我悟了。低版本jQuery导致XSS POC文件文末获取。

java.io.IOException: Could not find resource com/itheima/mapper/UserMapper.xml

问题:Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/itheima/mapper/UserMapper.xml问题描述:找不到UserMapper解决方案:这是我原来的路径这是我改后的路径(很重要&#xff…

羊了个羊游戏开发教程2:随机生成卡牌

本文首发于微信公众号: 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。嗨!大家好,我是小蚂蚁。上一节教程里我们实现了游戏中最难的地方——堆叠牌的拾取,这节教程我们来继续学…

关于CountDownLatch

关于CountDownLatchCountDownLatch 是什么CountDownLatch 如何工作CountDownLatch API使用示例与 Join 的区别CountDownLatch 是什么 CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已…

强化学习基础

强化学习的三种方法 基于价值(value-based) 基于策略(policy-based) 基于模型(model-based) 一 基于价值的方法 基于价值 (Value-Based)这种方法,目标是优化价值函数V(s)。 价值函数会告诉我们…

LeetCode 1669. 合并两个链表(C++)

思路: 该题思路很简单,对于单向链表,先遍历到指定的右边界的位置b1,做好标记供连接; 然后对于a-1位置的结点,连接list2,并最后连接后半段的list1 1.题目如下: 给你两个链表 list1 …

ATX agent+UIautomation2 自动化测试介绍

目前ATXUIautomator2 处于自动化界的浪口风尖,现在有幸终于有时间对ATX进行了粗浅的了解 为什么要用ATX ATXUIautomator2的优势: 1.速度吊打appnium,群里面的人这样说的 运行速度快,比Appium运行速度快了好多。(用…

分布式架构

目录 一、前言 二、分布式架构的发展历史 三、分布式架构发展的里程碑 四、分布式系统的意义 五、分布式架构的常见概念 六、分布式领域中冯诺依曼模型的变化 七、分布式系统的难点 八、总结 一、前言 ​  我们都知道,当今无论在BAT这样的大公司&#xff…

Install Linux on Windows with WSL2 (使用 WSL2 在 Windows 上安装 Linux)

Install Linux on Windows with WSL2 (使用 WSL2 在 Windows 上安装 Linux)https://learn.microsoft.com/en-us/windows/wsl/ 在 Windows 上运行 Linux - 在 Windows 11 上运行 Ubuntu 20.04 LTS Developers can access the power of both Windows and Linux at the same tim…

实验十三、阻容耦合共射放大电路的频率响应

一、题目 利用 Multism 从以下几个方面研究图1所示的阻容耦合共射放大电路的频率响应。图1阻容耦合共射放大电路图1\,\,阻容耦合共射放大电路图1阻容耦合共射放大电路(1)设 C1C210μFC_1C_210\,\textrm{μF}C1​C2​10μF,分别测试它们所确定…

6万字电力行业系统解决方案光伏电站综合安防系统解决方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 第 一 章背景与需求 1.1行…