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以下であり、この関数が3回以下実行された。この機能を削除すると、メモリリークは発生しません。
アップデート:
@GarethMcCaughanの提案に従って、alert(i)をループの先頭に追加しました。アラートは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回の実行しか表示されません。しかし、なぜ関数が繰り返し呼び出されるのでしょうか。
次に、コンソールがループの先頭にブレークポイントを報告していることを発見しました(コメントアウトしました)。これが、関数が呼び出しを続ける理由ですか?