大家看看為什么我這個代碼去掉break也不會報錯,按說會陷入死循環(huán)的啊?
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文檔</title>
</head>
<body>
<ul id="test">
? ? <li>JavaScript</li>
? ? <li>HTML</li>
</ul>?
?
<script type="text/javascript">
? var otest = document.getElementById("test"); ?
? var li=document.createElement('li');
? li.innerHTML='php';
? var oChild=otest.childNodes;
? for(var i=0;i<oChild.length;i++){
? ? ? if(oChild[i].innerHTML=='HTML'){
? ? ? ? ?otest.insertBefore(li,oChild[i]);
? ? ? ? ?break;
? ? ? }
? ? ? document.write(otest.childNodes.length+',');//沒有break的話是5,5,5,6,6,6,
? ? ??
? ? }
??
</script>?
</body>
</html>
2016-09-18
不會出現(xiàn)死循環(huán) ,當你把?var oChild=otest.childNodes;這句寫出來時,o
oChild已經是一個固定的值存在內存中了,你的otest已經對這個值沒有任何影響了,循環(huán)該到哪里結束哪里結束,
當然如果你直接寫成
? for(var i=0;i<otest.childNodes.length;i++){
? ? ? if(otest.childNodes[i].innerHTML=='HTML'){
? ? ? ? ?otest.insertBefore(li,otest.childNodes[i]);
? ? ? ? ?break;
? ? ? }
? ? ? document.write(otest.childNodes.length+',');//沒有break的話是5,5,5,6,6,6,
? ? }
就知道了,還是會死循環(huán)的呀
2016-09-05
出現(xiàn)死循環(huán)的可能是在if這里,你插入了兄弟節(jié)點后會改變oChild.length值,這樣每插一次就增加一次,沒完沒了的,但是代碼好像不是這樣執(zhí)行的,
var li=document.createElement('li');
li.innerHTML='php';
這兩句從外面移植到if里,再去掉break就死了 ;這兩句在外面的時候即使沒有break也不會有問題,猜測和insertBefore運行規(guī)則(內存中已經存在某個元素時,只會插入一次,純屬猜想,并不知道是不是這樣的)有關系 !
2016-09-04
怎么會死循環(huán)呢?首先你的oChild.length是3或者5(具體看瀏覽器的不同判定也不同),這里的oChild.length是5;
然后我們來看你的循環(huán)語句,此時oChild.length是5; 由于你加了if判斷語音,導致for循環(huán)到了oChild[i].innerHTML=='HTML'就停止執(zhí)行(break);這個過程這執(zhí)行了三次。所以下面會出現(xiàn)3個5()
把break取消后,?otest.insertBefore(li,oChild[i]);在找到oChild[i].innerHTML=='HTML'插入了兄弟節(jié)點,所以后面會出現(xiàn)三個6(oChild.length由5變成6,)for語句在過程中在此被執(zhí)行了3次;
如果還是不明白,你把
? ? ? document.write(otest.childNodes.length+',');//沒有break的話是5,5,5,6,6,6, ?這段剪切到下面這段中去。就會明白了
?? if(oChild[i].innerHTML=='HTML'){
? ? ? ? ?otest.insertBefore(li,oChild[i]);
? ? ? ? ?break;