JS闭包循环引用导致内存泄漏之解决方法

方法一、主动设置JS对象element为空,打破循环引用

function assignHandler()

{
   var element=document.getElementById("div1");
   var id=element.id;
   element.οnclick=function() //element的onclick引用了函数funciton,function通过闭包引用了element,照成循环引用
   {
      alert(id+element+sex);
    }
 /*闭包可以监听外部变量的变化,所以这里把element=null,也就是说外部这个变量相当于不存在了,虽然赋值是在闭包后面,闭包也能够检测到!所以匿名函数不会有外部的DOM对象的引用,不会内存泄漏*/
  var sex="female";
  element=null;

}


方法二、通过添加另外一个闭包来避免JS对象和DOM对象之间的循环引用

 window.οnlοad=function outerFunction()
{
  var anotherObj=function innerFunction()
   {
            alert("I have avoided the leak!");
   }
//通过另外一个闭包来避免JS对象和DOM对象之间的循环引用
  function anotherInnerFunction()
   {
        var obj=document.getElementById("div1");
 //DOM对象引用了anotherObj函数,但是anotherObj函数无法引用DOM对象
        obj.οnclick=anotherObj;
  };
  anotherInnerFunction();
}

方法三、通过添加另一个函数来避免闭包本身,进而阻止内存泄漏

window.οnlοad=function()
{
        var obj=document.getElementById("div1");
        obj.οnclick=doesNotLeak;
}
//该函数无法访问上面匿名函数中间的obj对象,从而可以阻止内存泄漏!
function doesNotLeak()
{
   alert("我已经阻止内存泄漏了!");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值