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

1.什么是闭包?

闭包就是:函数+定义函数的词法环境
有的解释说:这个函数必须是定义在一个函数中的函数

2.什么是内存泄漏?

因为JS有垃圾回收,内存中无法触达但垃圾回收无法回收的内存空间,会造成内存泄漏。在JS中还有一种情况,不在使用的内存但没有手动置为null,这部分内存永远不会被回收,也会被认为是内存泄漏。

3.闭包会造成内存泄漏的情况?

情况一:错误的持有本该被销毁的函数引用,会导致函数关联的词法环境无法销毁,造成内存泄漏。
情况二:多个函数共享词法环境时,可能造成词法环境膨胀,这就可能出现无法触达且无法销毁的内存,造成内存泄漏。

情况一

function a(){
	let b = 123;
	function fun{
		console.log(b);
	}
	return fun;
}
const c = a();
c();

当调用c后,后面的代码不在使用c了,但c一直保持函数的引用,永远不会被销毁,造成内存泄漏。

类似的情况还有:
1.未被销毁的定时器
2.没有使用var定义的变量,直接挂在window上

情况二

function run(){
	const arr = new Array(100000).fill(0);
	const a='';
	let b =1 ;
	function fun(){
		debugger;
	}
	function temp(){
		//该函数使用了用到了arr 
	}
	return fun;
}
const f = run();
f();

fun 和temp共享一个作用域,fun沒有使用到arr,但是temp使用到了arr,所以在共享的作用域中arr沒有被销毁但又无法触达,造成內存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值