随笔 - 10  文章 - 0  评论 - 0  阅读 - 3751

闭包以及内存泄露

什么是闭包

闭包是一种函数结构的统称,就是一群长相结构大差不差的函数群体就叫做闭包。那么它有啥特点呢?最大的特点就是儿子函数使用或者访问了祖宗函数的私有变量,这样的玩意就是闭包。

举个栗子,马爸爸家里有若干个亿,刚好你看中的最新款劳斯莱斯幻影还差点钱,你想合理且合法的花马爸爸的钱,怎么办?最简单粗暴的方法是你变成他儿子住进他家里去,这样你就拥有了他私人财产的支配权,闭包也是如此,内部函数就是你,外部函数就是马爸爸,外部函数的变量就是马爸爸的钱,这就是闭包。

官方来说,闭包可以使内层函数访问外层函数的私有变量,并同时保证被访问的外部变量不泄露至全局变量中,保证了变量的安全性,又因为变量被引用的原因,内部变量并没有像以前一样,函数调用后就销毁,反而延长了变量的生命周期。

举个例子:

复制代码
function f1(){

    var n=999;

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999
复制代码

什么是内存泄漏

先来一波内存泄漏的定义,其实说白了就是该内存空间使用完毕之后未回收。

了解什么是闭包后,就比较容易了解内存泄露了。而说到内存泄漏就要提垃圾回收机制。

js中,按照垃圾回收机制,程序执行完毕后,全局变量和被引用着的变量是无法被垃圾回收机制回收的,也就是说除非你手动释放内存,不然他们就一直在你的内存空间里,像上述例子中,result是全局变量,全局变量不知道什么时候又会被使用,故内存中会一直保持着本该销毁的变量n。

而内存溢出则是指内存中存在大量的内存泄漏状况,举个栗子,假如上例中的:

var result=f1();

在你的代码中超多,也就是有很多类似result的全局变量对一个函数内的变量进行引用,这时就会造成内存中存在大量本应该在函数执行完毕后就销毁却被无法销毁的局部变量,导致大量内存被占无法释放,如果不加以控制,依然增加此种行为的话,就会导致内存溢出。所谓内存溢出其实也就是内存不够用了占满了的意思。所以要注意闭包只是很容易有内存溢出的风险,并不是说闭包一定会导致内存溢出。

关于垃圾回收机机制,感兴趣的可以自己去看看,有个博主写的还挺有意思,但我找不到了。。。。。。

 

posted on   爱敲代码的关耳  阅读(201)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示