关于JS内存泄漏

总见到各种文章啦博客啦提到“内存泄漏”,那么到底什么是内存泄漏嘞?

我把自己看过的这些文章大致总结了一下。

 

一、什么是内存泄漏

我们在码代码的时候,经常会为一些变量啦、进程啦分配一部分内存。通常来说,一部分代码执行完成后,有些垃圾回收机制会自动将不用的内存回收以便复用。但在某些情况下,垃圾回收无法自动执行,这时有些内存得不到回收,就会一直被占用,这就是所谓的“内存泄漏”。

所以其危害,也是能想到的,资源耗尽后,系统会反应十分缓慢,因为无法有空闲内存创建新的进程,无法及时响应用户操作。

 

二、内存泄漏的几种情况及解决方法

1、 闭包

闭包在js中是个常用的东东。但因为其内部变量被调用后,外层函数所占内存也是无法被释放的,所以会产生内存泄漏。

我们可以将不再使用的对象手动解除占用,如:

functionbindEvent()
{
    var obj=document.createElement("XXX");
    obj.οnclick=function(){
        //Even if it's aempty function
    }
    obj=null;
}


2、 循环引用

之前笔试的时候做过一道题,是酱紫的:

var a= document.getElementById(“id1”)
var b= document.getElementById(“id2”)
a.x= b;
b.x= a; 
问会出现什么情况。这什么鬼哦~后来才知道这样的互相调用会出现内存泄漏,无止境的你掉用我我调用你的情况,直到浏览器关闭。所以最好还是避免这种情况。

 

3、 全局变量

这个一不小心就会出现的问题,很多人并不以为意。比如:

functionfoo() { a = "I love u"; }

a这个全局变量就会一直存在。所以还是尽量避免这种情况,使用var来声明局部变量。当然,可以使用严格模式来适当的规避这个问题。

 

4、 移除DOM节点但其绑定的事件木有移除

有两种方式:

第一种,我比较喜欢用,也很好理解。就是“事件委托”~通过事件的冒泡属性,相当于把事件绑定在其父元素上。具体方式详见“事件委托”相关教程~哈哈。

另一种,手动移除。先将事件(如oncilck等)设置为null,再移除对应的元素。

例纸:

<div id="Div">
    <input type="button" id="Btn">
</div>
<script type="text/javascript">
    var btn = document.getElementById("Btn");
    btn.onclick = function(){
        btn.onclick = null;
        document.getElementById("Div").revome(btn);
    }
</script>


5、 删除对象但其内部属性仍然存在

这时应该遍历对象的每一个属性,并且依次删除

而且要深度遍历,因为某个属性值也可能是对象~

 

6、 一些操作

如:appendChild和removeChild。

这个很奇怪:在appendChild时,应该又子到父由内向外append。

var parent =document.createElement("div"); 
var child =document.createElement("div"); 
parent.appendChild(child); 
document.body.appendChild(parent); 
不然 remove 是释放不了的。不造为啥 ~ 应该是一个规定。

 

 

先总结这么多吧。还有一些情况,遇到了再总结。综上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值