向各位请教下javascript内存泄露leak的原因有哪些?

蔡袅 2011-07-30 02:07:29
     LTEvent.addListener(this.map,"mouseup",function(point, button)
{
if(button==2)
{ //只对鼠标右键其效果
var latlng=other.map.getClickLatLng(point); //像素坐标转经纬度
var m_Lat=latlng.getLatitude();
var m_Lng=latlng.getLongitude();
var addMarkTip=document.getElementById("addMark");
addMarkTip.style.display='block';
addMarkTip.style.zIndex='9999';
var m_Address='';
var subAdd=BGMmap.$('addsubmit');
var SubCancelBtn=BGMmap.$('SubCancel');
var Addrobj=BGMmap.$('addrid');
SubCancelBtn.onclick=function() //取消按钮
{
addMarkTip.style.display='none';
addMarkTip.style.zIndex='2000';
Addrobj.value='';
};
addMarkTip=null;
SubCancelBtn=null;
subAdd.onclick=function()
{

m_Address=Addrobj.value;
window.external.AddMarkerToMap(m_Lat,m_Lng,m_Address,1); //添加到数据库之后自动关闭
addMarkTip.style.display='none';
addMarkTip.style.zIndex='2000';
Addrobj.value=''; //清空文本框



//添加标注
var m_marker =new LTMarker(latlng);
other.map.addOverLay(m_marker);
m_marker.setLabel(m_Address);

var tmp_marker=m_marker;
subAdd=null;
LTEvent.addListener(m_marker, "click" , function(pnt,btn){ //点击标注提示更新、删除


if(btn==1) {//只能左键点击
var m_Lat1=m_Lat;
var m_Lng1=m_Lng;



//显示更新删除对话框
var DeleteUpdate=document.getElementById("DeleteUpdate");
DeleteUpdate.style.display='block';
DeleteUpdate.style.zIndex='1000';
var subUpdate=BGMmap.$('updatesubmit');//获取更新提交按钮
var updaterobj=BGMmap.$('addridupdate'); //获取更新输入框
updaterobj.value=m_Address; //填充更新文本框
//点击更新
subUpdate.onclick=function()
{
var m_updateAddress=''; //更新地址
m_updateAddress=updaterobj.value;
m_Address=updaterobj.value;
tmp_marker.setLabel(m_Address);
window.external.UpdateMarkerToMap(m_Lat1,m_Lng1,m_updateAddress,1); //更新到服务端
DeleteUpdate.style.display='none';
DeleteUpdate.style.zIndex='1000';
tmp_address=new LTMarker(latlng);
};
subUpdate=null;
var otherobj=other;

//删除按钮
var subDelete=BGMmap.$('deletesubmit');
subDelete.onclick=function()
{
window.external.DeleteMarkerToMap(m_Lat1,m_Lng1,1); //删除提交到服务端
DeleteUpdate.style.display='none';
DeleteUpdate.style.zIndex='1000';
otherobj.map.removeOverLay(tmp_marker); //删除标注
};
subDelete=null;
//点击取消
var UDCancelbtn=BGMmap.$('UDCancel');
UDCancelbtn.onclick=function()
{
DeleteUpdate.style.display='none';
DeleteUpdate.style.zIndex='1000';
};
UDCancelbtn=null;
DeleteUpdate=null;
}
});
}; subAdd=null;
}

});


最近完成了一个51ditu的gis导航系统,发现脚本部分存在内存leak,大家说说一般哪些情况会导致内存泄露?
...全文
243 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
子夜__ 2011-07-30
  • 打赏
  • 举报
回复
豆虫 2011-07-30
  • 打赏
  • 举报
回复
其实所谓内存泄露 一般指变量占用的内存未及时回收的现象

LZ的例子需要注意的检查是否存在这种情况:
DOM元素带有Js对象onclick事件,而onclick里面又带有这个DOM元素的引用 如果是这样的话 会形成一种环状结构 造成内存泄露 FF下还好 IE下表现尤为明显 它不受js解析机制管理 甚至有可能吃光你的内存

解决办法就是在DOM元素被抛弃之前移除绑定在上面的事件

再比如说:innerHTML 大家都常用的
在某个DOM元素例如Div里添加很多Html代码,用innerHTML赋值进去,然后触发某事件后整个替换掉innerHTML,那么被替换以前的Html代码很可能带有这样的环状结构,导致页面只要不刷新,内存就会一直泄露着越来越严重,直到吃光内存

还有像闭包的使用 也存在leak问题 LZ感兴趣的话自己搜搜 期待在这方面有总结的牛人来踩踩你的帖~~~

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧