想问一下闭包导致内存泄漏的原理

想问一下闭包导致内存泄漏的原理

面试的时候被问到了不知道怎么回答,闭包的内存是怎么释放的呢?函数运行结束之后闭包依然存在吗?解决方案是什么呢?网上看了一些资料还觉得不是理解的特别清楚

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
小丸子爱吃菜 2017-09-22 10:37:14

 内存泄露:JavaScript的垃圾自动回收机制会按一定的策略找出那些不再继续使用的变量,释放其占有的内存。然而由于一些原因导致在这种机制下内存管理器不能正确解读JavaScript变量的生命周期,从而没有释放其内存,而也没有再被使用。循环引用是导致以上情况的主要原因
循环引用:两个对象的互相引用
例如:    
function example(){  
        var element =document.getElementByID("div1"); //①  
        element.onclick = function() {  
            alert("This is a leak!"); //②  
        }  
    }  
这个函数example() 中用匿名函数创建了一个闭包。第①句:JavaScript对象element引用了一个DOM对象(其id为“div1”); JS(element) ----> DOM(div1)。第②句:该DOM对象的onclick属性引用了匿名函数闭包,而闭包可以引用外部函数example() 的整个活动对象,包括elemnt ; DOM(div1.onclick) ---->JS(element)由此形成了JavaScript对象和DOM对象的隐蔽循环引用。解决办法:在JavaScript代码段运行完之时将形成循环引用的JavaScript对象手动设置为空,切断引用。
即:function example(){  
        var element =document.getElementByID("div1"); //①  
        element.onclick = function() {  
            alert("This is a leak!"); //②  
        }  
        element = null; //添加的语句  
    }   

闭包的相关问题还是比较深的,以目前学的知识去理解它肯定是很困难的,闭包涉及的知识点很多,比如内存、变量、作用域等等,还是先把知识打牢再去深入了解这个问题。可以先把面试的这个问题记下来,以后边学边去理解它。

祝学习愉快!

  • 提问者 精慕门656851 #1
    想问一下如果是JS对象属性引用了闭包,会出现内存泄漏吗?需要把JS对象使用结束之后设置为空吗?如果是值类型引用闭包会引起内存泄漏吗?闭包生命周期什么时候会结束呢?
    2017-09-23 15:38:40
  • 卡布琦诺 回复 提问者 精慕门656851 #2
    这个不是一定就会出现内存泄漏,需要根据具体的代码来分析判断。祝学习愉快!
    2017-09-23 19:32:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
进击JavaScript核心 2018
  • 参与学习       466    人
  • 提交作业       74    份
  • 解答问题       635    个

JavaScript不仅能实现静态页面到动态特效的转变,还能完成数据的动态交互,但是关于js到底功能有多强大,大家还是有所期待的,本路径将带你深入到js中,一一揭开JavaScript的神秘面纱。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师