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("我已经阻止内存泄漏了!");
}
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("我已经阻止内存泄漏了!");
}
相关文章推荐
- js的BOM对象
- javascript经典 面试题及答案
- javascript闭包
- iScroll.js 用法参考 (share)
- js动态改变图片src在ie6下的兼容问题
- 开发人员使用Angular JS的五大理由
- JSON.NET 简单的使用
- JSON.NET 简单的使用
- javascript命名规范
- 【翻译+山寨】html5+css3+js实现翻页翻书效果
- Box2D.js简易示例
- JSP之静态include指令、动态Include指令
- EPUB.js 解决图片裁剪问题(缩放问题)
- 关于ajax后台success传来json数据的问题
- EPUB.js 解决图片裁剪问题(缩放问题)
- js去掉文本前后空格与阻止表单提交
- JS三大经典变量命名法
- js方法备忘
- JavaScript判断数组是否存在key
- js轮播的实现