想问一下闭包导致内存泄漏的原理
面试的时候被问到了不知道怎么回答,闭包的内存是怎么释放的呢?函数运行结束之后闭包依然存在吗?解决方案是什么呢?网上看了一些资料还觉得不是理解的特别清楚
正在回答 回答被采纳积分+1
内存泄露: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; //添加的语句
}
闭包的相关问题还是比较深的,以目前学的知识去理解它肯定是很困难的,闭包涉及的知识点很多,比如内存、变量、作用域等等,还是先把知识打牢再去深入了解这个问题。可以先把面试的这个问题记下来,以后边学边去理解它。
祝学习愉快!
- 参与学习 466 人
- 提交作业 74 份
- 解答问题 635 个
JavaScript不仅能实现静态页面到动态特效的转变,还能完成数据的动态交互,但是关于js到底功能有多强大,大家还是有所期待的,本路径将带你深入到js中,一一揭开JavaScript的神秘面纱。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星