转《js闭包与内存泄漏》

首先,能导致内存泄漏的一定是引用类型的变量,比如函数和其他自定义对象。而值类型的变量是不存在内存泄漏的,比如字符串、数字、布尔值等。
因为值类型是靠复制来传递的,而引用类型是靠类似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

时间: 2024-12-14 04:15:21

转《js闭包与内存泄漏》的相关文章

[转]《鸟人》

以下来自豆瓣影评 0. 饰演主角Riggan的,正是多年前饰演过<蝙蝠侠>和<蝙蝠侠归来>的Keaton 1. 电影的一大主题,就是演员们极度稀薄的安全感,以及对于接受和肯定的“瘾”.这些演员都有着不同形式的自我痴迷. Keaton不停地跟自己的阴暗面斗嘴,一方面要关心自己话剧的质量,担忧别人对自己作为艺术家的看法,一方面又愤怒地“唏嘘”当年老子多辉煌,你们这帮人算个毛!老子可以拍“Birdman 4”发大财!当明明已经开始做话剧了,好好表演完成任务却不够,他又特别容易被外界干扰到

【谜院群】2017年3月24日鸟人素素主擂谜会题

[谜院群]2017年3月24日鸟人素素主擂谜会题 1.三月踏青携友旅(2字著名鱼具品牌)千又2.花开映日,淡化听莺语(8笔字)英3.垄上幽篁皆破土(同义字二)龙.皇4.前庭柳垂杏花度(14笔字)嘛5.莫道桃源晚归处(7笔字)沐6.风光几回,半遮绿岗路(2字词汇)网络7.紫陌孤行鸟语稠(央视主持人)路一鸣8.斜阳西下月初露(2字词汇)斗胆9.前坡银桃早烂漫(5字常言)金木水火土10.伊人花容,回顾门中见(2字古文常用疑问词)问君11.余留心迹成绝恋(10笔字)途12.空怀旧日同思念(5笔字)司13

2014鸟人Birdman中文字幕文件下载

下载后,解压缩,会得到 Birdman.2014.1080p.WEB-DL.DD5.1.H264-RARBG.srt 文件,把这个文件放到视频文件(mkv文件)相同的文件夹里. 用暴风影音播放,如果没有显示中文字幕,需要用播放器的“选择字幕”的菜单选择这个srt文件(播放器里点击右键,选择字幕,找到srt文件即可). 点击下载:Birdman.2014.1080p.WEB-DL.DD5.1.H264-RARBG.zip

编程模拟自然(九):元胞自动机

序 旧书有云:发鸠之山,其上多柘木.有鸟焉,其状如乌,文首.白喙.赤足,名曰精卫,其鸣自詨. 一日,精卫游于码海,溺而不返,后常衔西山之木石,以堙于海.有诗为证: 万事有不平,尔何空自苦: 长将一寸身,衔木到终古? 我愿平码海,身沉心不改: 码海无平期,我心无绝时. 呜呼!君不见,西山衔木众鸟多,鹊来燕去自成窠! (前情提要:主角元乘坐返回舱降落到了码海上,随后遇到了个鸟人...) “咳咳,远道的客人,我名精卫XIV,乃是先祖精卫鸟的第十四代后裔...”鸟人作自我介绍 “...你是谁,从哪里来又

商代王后妇好、玉器及特展相关资料整理

1.展览的相关说明 展览: 玉鸣锵锵--商代王后妇好玉器特展 时间: 2016.12.27-2017.3.26 地点: 三楼书画厅 本展览为收费展览,全票30元,半票15元. 半票优惠人群: 教师.学生.军人(购票时出示相关证件:60岁以上老人(购票时出示身份证或老人证):1.2-1.4米儿童:20人以上团体. 免票范围: 1.2米以下小童(需在成人陪同下参观):博物馆同行.博物馆协会成员(检票时出示相关证件):残障人士(检票时出示相关证件). 2.展览分为五个部分 第一部分:"发现妇好&quo

新年最新的100句超牛的语言(转)

1.二农戏猪 2.干掉鸟人我就是天使! 3.帅有个屁用!到头来还不是被卒吃掉! 4.好好活着,因为我们会死很久!!! 5.有没有听过“大猪说有,小猪说没有”的故事? 6.女友问我她死了我会怎样我坚定的说:我不会独活(再找一个活)她大悦~! 7.人工智能和天然愚蠢无法相提并论——因为我们主张纯天然. 8.在教堂听讲经的时候我们应该保持肃静,打扰别人睡觉是很不礼貌的. 9.陪聊,提供夜间上门服务.(一个墓志铭) 10.人又不聪明,还学人家秃顶!! 11.你是电,李四光,你是唯一的神话… 12.笨人的

高中时候经常说的口头禅

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.一般般啦!32.随便!33.叫你……你又不听

绕过HR破门而入的求职智慧

以往我们在网上看到的很多求职文章或指导性纲领,譬如啥自信.做功课.良好形象.华丽的简历.工作经验.口才啥的,其实到了21世纪尤其是互联网高速发展的今天,前面这些技巧就显得无比空洞: 1.因为自信谁都可以做到哪怕装都能装出来 2.简历,谁都可以用各种模板来打造,至于说HR们是否看到华丽的简历就立刻对你打100分这也是有扯淡嫌疑的 3.良好形象.一般来说主要是衣着得体.气质不俗,长得好看不好看已经不怎么重要了,长得好看只能说明你大学时期课外生活也许很丰富,长得不好看也不代表你一定是个很努力的人 4.

【原创】win10下搭建vue开发环境+IIS部署

[原创]win10下搭建vue开发环境 如果要转发,请注明原作者和原产地,谢谢! 特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图: 详细的安装步骤如下: 一.安装node.js 说明:安装node.js的windows版本后,会自动安装好node以及包管理工具npm,我们后续的安装将依赖npm工具. node.js的官方地址为:https://nodejs.org/en/download/,如下图所示: 根据自己电脑的具体配置,选择你要下载的安装

《设计你的人生》的部分经典语录

每个优秀的人,都有一段沉默的时光.在那一段时光,你付出了很多努力,忍受孤独和寂寞,不抱怨不诉苦,最后渡过了这段感动自己的日子. ——苏引华<设计你的人生>很多人在开始梦想时发现别人己经实现了自己要实现的梦想,于是就开始怀疑自己追不上了于是就放弃了梦想,最终成为了普通人!——苏引华<设计你的人生>很多人没有成功并不是他不能成功,而是他根本没有想过要成功或如何成功,生命当中有很多事情最初拥有的只是梦想,以及豪无根据的自信而己,但是,所有的一切,都从这里出发!——苏引华<设计你的人