闭包、内存泄漏与垃圾回收

摘抄:https://blog.csdn.net/Q846169253/article/details/81148290
闭包就是能够读取其它函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解为“定义一个函数内部的函数"
本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

function makeFunc(){
    var name = "Mozilla";
    function displayName(){
        alert(name)
    }
    return displayName
}
const myFunc = makeFunc();
myFunc()

试一试结果:js中的函数形成了闭包,在本例子中,myFunc是执行makeFunc时创建的displayName函数实例的引用。displayName的实例维持了一个对它的词法环境(变量name存在与其中)的引用,因此,当myFunc被调用时,变量name仍然可用

function makeAdd(x){
    return function(y){
        return x + y
    };
}
var a = makeAdd(5);
var b = makeAdd(10);
console.log(a(2)); //7
console.log(b(2)); //12

闭包的原理

借助函数的立即执行、参数以及函数的return返回值,多创建了一层作用域。从而实现外部函数持续被引用而不能释放内存空间,将值存储下来

闭包的作用

闭包就是将函数内部和函数外部连接起来的一座桥梁。使得外部函数可以读取内部函数的变量,这些变量的值始终保持再内存中,不会被垃圾回收器回收。

闭包如何从外部的作用域读取到内部作用域的东西

那就是在函数的内部,再定义一个函数。将内部函数传递到所在词法作用域以外

闭包的优点

  • 避免全局变量被污染
  • 方便调用上下文的局部变量
  • 加强封装性

闭包的缺点

  • 闭包常驻内存,内存消耗很大
  • 可能导致内存泄漏
    解决方案:在退出函数之前,将不使用的局部变量全部删除
    如何删除?
// 普通变量:将变量置为undefined
var tt = 111;
tt = undefined;
//带有属性或者方法的, 用delete删除属性或方法
delete tt.name 

内存泄漏

一块被分配的内存既不能被使用,也不能回收,从而影响性能,从而导致程序崩溃。
内存泄漏起因:一般使用技术系统来处理内存,每个对象根据被引用对象多少来计数,当计数为零时,该对象就会被销毁,释放内存。而当两个对象循环引用时,计数始终为1,则永久性地占着内存。而闭包实际上非常容易造成js对象的dom对象的循环引用

function ex(){
  var element = document.getElementByID('div1');
  element.onclick=function(){
      alert("aaa")
  }
}

ex()用匿名函数创建闭包,该DOM对象的onclick属性引用了匿名函数闭包,而闭包可以引用外部函数example()的整个活动对象,包括element;DOM(div1.onclick)--->JS(element) 由此形成了Javascript对象和DOM对象的隐藏循环引用。
造成的内存泄漏
解决方法:
在js代码段运行完之后将形成循环引用的js对象设置为空
function example(){
var element = document.getElementByID("div1");
element.onclick = function(){
alert("This is a leak!")
}
element = null; //添加的语句
}

垃圾回收机制

找到那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的事件间隔周期性进行这一操作

两种方法———标记清除和引用计数
  • 标记清除
    垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量的标记和被环境中的变量引用的变量的标记,此后,如果变量再被标记则表示此变量准备被删除
    另一种解释:
    当变量进入执行环境时标记为“进入环境”,当变量离开执行环境时则标记为“离开环境”,而标记为“离开环境的变量则可以被回收”
  • 引用计数
    跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型的值赋值给该变量时,这个值的引用次数就是1,如果这个值再被赋值给另一个变量,则引用册数加1. 相反,如果一个变量脱离了该值的引用,则该值引用次数减1,当次数为0时,当次数为0时,就会等待垃圾回收器的回收。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容