但问题是你把它当有返回值使用了。你可以考虑把window对象过滤掉,目前想到的只有window对象会死循环。 function dispObj(o) { var s = ""; // .........return s; }sss.innerHTML=dispObj(window.frames);
我按各位以上所说去修改,还是undefined. 所以限制递归深度的语句也不能验证. <div id=sss>0</div><script>var s = ""; var i = 0;function dispObj(o) { if (i>=10) { return; } i++; s += "<table border=0 cellpadding=3 cellspacing=1 bgcolor='#7777f5'>" for (var e in o) { if (eval("o."+e)+"" == "[object]") { s += "<tr bgcolor='#AAAAf5'>"; s += "<td colspan=2> "+e+" <br/>"+dispObj(eval("o."+e))+"</td>" } else { s += "<tr bgcolor='#AAAACC'>"; s += "<td>"+e+"</td><td>"+eval("o."+e)+"</td>"; } } s += "</tr></table>" } //dispObj(eval("o."+e)) dispObj(window.frames);//document.write("dddddd"+s) sss.innerHTML=s; alert(window.frames.window.frames.window.frames.window.frames) </script>
但是,按你这样递归,会有死循环的。
eval("o." + e) 可以写成 o[e]像上楼所说,你在递归的时候传的参数也错了,不过改对之后会提示溢出(死循环)。
是死循环,主要是在window对象上。window.window.window.window......... 可以无限级引用。
window.frames.window.frames.window.frames.window.frames可以一直这样下去的.alert(window.frames.window.frames.window.frames.window.frames);
但问题是你把它当有返回值使用了。你可以考虑把window对象过滤掉,目前想到的只有window对象会死循环。
function dispObj(o)
{
var s = ""; // .........return s;
}sss.innerHTML=dispObj(window.frames);
<div id=sss>0</div><script>var s = "";
var i = 0;function dispObj(o)
{
if (i>=10)
{
return;
}
i++; s += "<table border=0 cellpadding=3 cellspacing=1 bgcolor='#7777f5'>"
for (var e in o)
{
if (eval("o."+e)+"" == "[object]")
{
s += "<tr bgcolor='#AAAAf5'>";
s += "<td colspan=2> "+e+" <br/>"+dispObj(eval("o."+e))+"</td>"
} else
{
s += "<tr bgcolor='#AAAACC'>";
s += "<td>"+e+"</td><td>"+eval("o."+e)+"</td>";
}
}
s += "</tr></table>"
}
//dispObj(eval("o."+e))
dispObj(window.frames);//document.write("dddddd"+s)
sss.innerHTML=s;
alert(window.frames.window.frames.window.frames.window.frames)
</script>
IE下没有问题。sss.innerHTML = s;
变更为
document.getElementById("sss").innerHTML = s;就OK了。