首页 > 系统相关 >闭包以及内存泄露

闭包以及内存泄露

时间:2022-11-26 20:11:48浏览次数:45  
标签:闭包 函数 内存 全局变量 泄露 变量 result

什么是闭包

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

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

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

举个例子:

function f1(){

    var n=999;

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999

什么是内存泄漏

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

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

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

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

var result=f1();

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

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

 

标签:闭包,函数,内存,全局变量,泄露,变量,result
From: https://www.cnblogs.com/zsy1006/p/16421573.html

相关文章

  • PostgreSQL数据库动态共享内存管理器——dynamic shared memory segment
    首先看dynamic_shared_memory_typeGUC参数,该参数用于指定dynamicsharedmemoryimplementation类型(DSM_IMPL_POSIX、DSM_IMPL_SYSV、DSM_IMPL_WINDOWS、DSM_IMPL_MMAP,定义......
  • 如何扩展 Mac mini 2018 内存条 All In One
    如何扩展Macmini2018内存条AllInOne升级Macmini(2018年)的内存https://support.apple.com/en-us/HT205041#onehttps://support.apple.com/zh-cn/HT205041#on......
  • Linux 查看内存大小
    top命令按E(可按多次,每次单位不一样) ......
  • 【汇编语言】实验1 查看CPU和内存,用机器指令和汇编指令编程
    ​【汇编语言】实验1查看CPU和内存,用机器指令和汇编指令编程文章目录​​【汇编语言】实验1查看CPU和内存,用机器指令和汇编指令编程​​​​一、配置环境​​​​二、熟悉......
  • 【汇编语言】第3章 寄存器(内存访问)
    ​【汇编语言】第3章寄存器(内存访问)本文分为4个部分:书本知识点概览书本自带的小结书本习题解析个人小结文章目录​​【汇编语言】第3章寄存器(内存访问)​​​​知识点概览......
  • [ Linux ] 进程间通信之共享内存
    在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先......
  • java ThreadLocal 内存泄露
    原文:https://zhuanlan.zhihu.com/p/56214714 前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之......
  • 后端踩坑笔记:记一次内存泄漏查障修复过程
    前言由于某开发项目的特殊性,在开发过程中需要将一些核心的代码加密。但是项目一开始就是由swoft框架(一个基于swoole的PHP框架)进行开发,未找到swoft代码加密工具。因此想到了......
  • PHP 数组占用内存分析
    下面的做法会占用多大的内存?list($appid,$openid)=["testcontent","test"];测试:$m0=memory_get_usage();$k=range(1,200000);$m1=memory_get_usage();echoround((......
  • PHP闭包之变量作用域
    在项目中,难免会遇到闭包的形式,那么在闭包中,变量的作用域到底是怎么样的呢。下面有几个简单的例子。functiontest_1(){$a='php';$func=function($b)use($a)......