function parseAttach(b)
{
var h="";
for(i=0;i<b.length;i++)
{
var a=b[i];
switch(a['type'])
{
case "image":
h+='<li class="attach aImg" style="background:#000;border-bottom:2px solid #fff"><img style="max-width:425px;max-height:500px" src="http://img.xiami.com/u/phoo/'+a['file']+'"></li>';
break;
case "video":
h+='<li class="attach aVideo" style="background:#f3f3f3"><span class="MxND" f="'+a['from']+'" d="'+a['id']+'"></span></li>';
break;
case "music":
h+='<li class="attach aMusic"><embed src="http://www.xiami.com/widget/0_'+a['id']+'/singlePlayer.swf" type="application/x-shockwave-flash" width="257" height="33" wmode="transparent"></embed></li>';
break;
}
}
return h;
}
一旦上面的函数正在运行,页面就不能交互,页面的内存和CPU使用率就会飞涨。为什么这个函数导致内存泄漏
这是传递给该功能的参数b
的例子:
[{"type":"video","from":"k6","id":"kyxGTZbD-vQ8Domm-eeHiQ"}]
b.length个不大于2,并执行该功能不超过三次。如果此功能被删除,内存泄漏将不会发生。
UPDATE:
继@GarethMcCaughan的建议下,我加入警报(我)到循环的顶部,它不断提醒0,我为首的调用代码:
for(i=0;i<c[0].length;i++)//the breakpoint
{
......
if(t[6].length>0)
{
//console.log(t[6].length);
//var a=parseAttach(t[6]);
var a="";
h+='<ul class="attaches">'+a+'</ul>';
}
......
}
为你在评论中看到,如果我用console.log替换调用,日志只显示4次执行。但为什么函数被重复调用?
然后我发现控制台在循环的顶部报告了一个断点(我已经注释掉了),这是函数继续调用的原因吗?
确定吗?这里一切都很好。你使用的是什么浏览器? –
你可能想在代码中加入一些'alert'来验证(1)'parseAttach'没有被调用很多次,(2)'b.length'确实不是很长,以及(3)它的功能确实在于你的脚本花费所有时间。 –
(我强烈怀疑至少1,2,3中的一个实际上并不是这种情况。) –