首先,能导致内存泄漏的一定是引用类型的变量,比如函数和其他自定义对象。而值类型的变量是不存在内存泄漏的,比如字符串、数字、布尔值等。
因为值类型是靠复制来传递的,而引用类型是靠类似c语言中的指针来传递的。
可以认为一个引用类型的变量就是一个指向某个具体的内存地址的指针

当我们用js代码创建一个引用类型的时候(以下简称对象),js引擎会在内存中开辟一块空间来存放数据,并把指针引用交给那个变量。内存是有限的,js引擎必须保证当开辟的对象没用的时候,把所分配的内存空间释放出来,这个过程叫做垃圾回收,负责回收的叫做垃圾回收器(GC)。

OK,内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。导致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。

不可控的东西才是最可怕的!

最经典的例子就是外部我们不可控的引用。比如说IE6中dom对象引用了js对象,而dom对象在某个时刻被移除掉了,但js引擎不知道它被移除掉,还傻傻的保留着引用呢,就不会把js对象释放。(ie7+改善很多了,我不是黑IE)

然后就是闭包中的引用了。咱们使用闭包的目的,就是要保存内部变量的状态以便我们哪个时候去通过闭包使用它作用域内的变量。

我们可以把闭包形象的理解为一道门,屋子里面是内部变量。钥匙是一个引用。
当我们把钥匙给张三这个对象(otherObject1.p1 -> 门),产生了一个引用
当我们再配一把钥匙给李四这个对象(otherObject2.p2 -> 门)产生了另外一个引用

GC在回收的时候会判断一个闭包还有没有人拿着钥匙,要是没有引用或者是内部循环引用(李四在屋子里),就会释放闭包内变量所在的空间,回收垃圾

我斗胆的说一句:严格意义上讲,闭包不是真正产生内存泄漏的原因!各位有意见可以评论里指出,现在举个最简单的例子:

function bindEvent() { var obj = document.createElement("XXX"); obj.onclick = function(){ // ... } } bindEvent(); 

这人把钥匙(引用)给了一个外部不可控的dom对象,怎么能怪人家闭包的错误呢!
再看下面代码:

var otherJsObj = {};
function bind() { otherJsObj.func1 = function(){ // ... } } bind(); 

我把钥匙给了otherJsObj。然后叮嘱它:“你不用的时候就把你的func1置空或者赋值成别的对象,解除我的引用,我好回收垃圾”。这样可控,因为咱们都是自己人(js对象),有访问权限[呵呵]

楼主会产生这样的困惑,是因为闭包确实是在保持对别的对象的引用。也会产生较大的内存占用。但这是可控制的,不是闭包的错。

转载于:https://www.cnblogs.com/ckAng/p/8728650.html

转《js闭包与内存泄漏》相关推荐

  1. 18个实时音视频开发中会用到开源项目

    实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前后处理.传输.解码.缓冲.渲染等很多环节.每一个细分环节,还有更细分的技术模块.比如,前后处理环节有美颜. ...

  2. 技术福利:最全实时音视频开发要用到的开源工程汇总

    [转自] https://my.oschina.net/jb2011/blog/1619628 1.前言 实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前 ...

  3. 福利贴:最全实时音视频开发要用到的开源工程汇总

    1.前言 实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前后处理.传输.解码.缓冲.渲染等很多环节.每一个细分环节,还有更细分的技术模块.比如,前后处理环 ...

  4. 实时音视频聊天中超低延迟架构的思考与技术实践

    1.前言 从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求.实时架构是超低延迟的基石,如何在信源编码.信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优 ...

  5. 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术

    本文引用了"拍乐云Pano"的"深入浅出理解视频编解码技术"和"揭秘视频千倍压缩背后的技术原理之本文引用了"拍乐云Pano"的&q ...

  6. 直播软件搭建音视频开发中的视频采集

    直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...

  7. 如何测试你的即时通讯实时音视频开发方案

    真正了解过实时音视频开发的同行都知道,实时音视频开发所需的技术储备和技能要求都是比较高的,当我们历尽折腾,自已捣鼓出的方案出声出图后,离产品化还有多远呢?为了避免出现测试不充分盲目上线导致用户体验不佳 ...

  8. 【新知实验室 三步完成Windows下实时音视频开发】

    三步完成Windows下实时音视频开发 第一步:开通产品 第二步:下载源码 第三步:编译源码 第四部:运行测试 背景介绍 实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度 ...

  9. Android端实时音视频开发指南

    简介 yun2win-sdk-Android提供Android端实时音视频完整解决方案,方便客户快速集成实时音视频功能. SDK 提供的能力如下: 发起 加入 AVClient Channel AVM ...

  10. 顶级技术大咖,揭秘实时音视频开发的超级风口

    2021年初因为Elon Musk"带货"而走红的音频社交App Clubhouse,又以肉眼可见的速度跌落神坛,下载量从2月的960 万/月跌至4月的92万/月.不过在5月,Cl ...

最新文章

  1. 1069 The Black Hole of Numbers
  2. spring异常Unsatisfied dependency expressed through constructor parameter 0
  3. 什么是进程什么是线程,他们的区别是什么
  4. getElementById和querySelector区别
  5. Eclipse没有server 配置Tomcat
  6. 位运算(按位与、按位或、异或、取反)以及原码、反码、补码
  7. create-react-app 使用代理做 mock
  8. 华为鸿蒙汽车自动驾驶,华为鸿蒙车机OS现身,自动驾驶再进化(一)
  9. Android自定义view之事件传递机制
  10. jq上传本地文件到服务器,jq实现前端文件上传
  11. IOS用正则验证手机号
  12. SVM多分类算法-一对一
  13. CAD2007输出高清图片
  14. 使用cboard(oracle数据库)
  15. win 10 右键新建offic失效问题
  16. ffplay播放器-数据读取线程
  17. IE浏览器发送两次相同请求第二次读取第一次缓存问题
  18. mysql distinct数量_MySQL SELECT DISTINCT和计数?
  19. 混合颜色带(基础篇)
  20. pytorch上分之路——视频补全算法(onion peel network)

热门文章

  1. linux7ip路由,Centos7源地址访问路由(双IP双网关配置)
  2. java输入验证码代码,JavaWeb 实现验证码功能(demo)
  3. nacos 下线接口_微服务架构nacos注册中心为什么那么火
  4. 基于ECharts+百度地图开发散点扩散图
  5. GDAL不支持创建PCIDSK的面状矢量格式
  6. GDAL源码剖析(十)之编写自己的扩展格式
  7. kindeditor php配置,KindEditor-编辑器配置参数属性 | 小灰灰博客
  8. 欢迎界面java_Linux命令行欢迎界面美化
  9. 浅析 golang module
  10. AMFPHP基本安全问题