您的位置:首页 > Web前端 > JavaScript

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

2015-09-18 11:13 821 查看
方法一、主动设置JS对象element为空,打破循环引用

function assignHandler()

{

var element=document.getElementById("div1");

var id=element.id;

element.onclick=function() //element的onclick引用了函数funciton,function通过闭包引用了element,照成循环引用

{

alert(id+element+sex);

}

/*闭包可以监听外部变量的变化,所以这里把element=null,也就是说外部这个变量相当于不存在了,虽然赋值是在闭包后面,闭包也能够检测到!所以匿名函数不会有外部的DOM对象的引用,不会内存泄漏*/

var sex="female";

element=null;

}

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

window.onload=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.onclick=anotherObj;

};

anotherInnerFunction();

}

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

window.onload=function()

{

var obj=document.getElementById("div1");

obj.onclick=doesNotLeak;

}

//该函数无法访问上面匿名函数中间的obj对象,从而可以阻止内存泄漏!

function doesNotLeak()

{

alert("我已经阻止内存泄漏了!");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: