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

先说内存泄漏是什么

内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

再说说闭包是什么

闭包:引用了另一个函数作用域中变量的函数,一般是嵌套形式。比如:

function closure(){
    let name = '小码农';
    return function(){
        return name;
    }
}

这就是个简单的闭包。

要想理解闭包必须理解函数作用域的创建和使用。

先了解执行上下文和作用域:

https://blog.csdn.net/liuhan4890/article/details/117037516?spm=1001.2014.3001.5501

然后我们再来看闭包,先加一句调用代码

function closure(){
    let name = '小码农';
    return function(){
        return name;
    }
}
let nameFunction = closure();
let result = nameFunction();

代码主要分三步:

1.声明closure方法

2.声明变量nameFunction为closure()的返回值

调用closure上下文,创建作用域链,先创建本身上下文的活动对象0,接着向上寻找创建全局上下文的变量对象1

3.声明变量result为闭包匿名函数的返回值

调用闭包函数的上下文,创建作用域链,先创建本身上下文的活动对象0,接着向上寻找创建closure上下文的活动对象1,最后寻找到全局,创建全局上下文的变量对象2

思考个问题:我们都知道,当某个作用域上下文执行完,若没有其他对象引用其内活动对象,其活动对象将被销毁。

那么当我们执行完closure()函数后,它的活动对象被销毁了嘛?

显然是没有的,因为我们的nameFunction变量返回了闭包匿名函数,而闭包匿名函数中引用了closure上下文活动对象中的name,如果闭包匿名函数不被销毁,则closure的活动对象就不会被销毁,不过closure的作用域链会被销毁,因为其执行完毕了,对应的作用域链也就销毁了。

整体流程如图:

所以我们要想避免内存泄漏,不必须的情况下不要使用闭包,闭包比其他函数更占用内存。若不得不用,要销毁其返回函数,解除对不能释放的活动对象的引用,类似这样

function closure(){
    let name = '小码农';
    return function(){
        return name;
    }
}
let nameFunction = closure();
let result = nameFunction();
nameFunction = null;

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值