亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

大家看看為什么我這個代碼去掉break也不會報錯,按說會陷入死循環的啊?


<!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>


正在回答

3 回答

不會出現死循環 ,當你把?var oChild=otest.childNodes;這句寫出來時,o

oChild已經是一個固定的值存在內存中了,你的otest已經對這個值沒有任何影響了,循環該到哪里結束哪里結束,

當然如果你直接寫成

? 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,

? ? }

就知道了,還是會死循環的呀

0 回復 有任何疑惑可以回復我~
#1

魔法師李維

我去測試了半天的確是只插入了一次
2016-09-18 回復 有任何疑惑可以回復我~

出現死循環的可能是在if這里,你插入了兄弟節點后會改變oChild.length值,這樣每插一次就增加一次,沒完沒了的,但是代碼好像不是這樣執行的,

var li=document.createElement('li');

li.innerHTML='php';

這兩句從外面移植到if里,再去掉break就死了 ;這兩句在外面的時候即使沒有break也不會有問題,猜測和insertBefore運行規則(內存中已經存在某個元素時,只會插入一次,純屬猜想,并不知道是不是這樣的)有關系 !

0 回復 有任何疑惑可以回復我~

怎么會死循環呢?首先你的oChild.length是3或者5(具體看瀏覽器的不同判定也不同),這里的oChild.length是5;

然后我們來看你的循環語句,此時oChild.length是5; 由于你加了if判斷語音,導致for循環到了oChild[i].innerHTML=='HTML'就停止執行(break);這個過程這執行了三次。所以下面會出現3個5()

把break取消后,?otest.insertBefore(li,oChild[i]);在找到oChild[i].innerHTML=='HTML'插入了兄弟節點,所以后面會出現三個6(oChild.length由5變成6,)for語句在過程中在此被執行了3次;

如果還是不明白,你把

? ? ? document.write(otest.childNodes.length+',');//沒有break的話是5,5,5,6,6,6, ?這段剪切到下面這段中去。就會明白了

?? if(oChild[i].innerHTML=='HTML'){

? ? ? ? ?otest.insertBefore(li,oChild[i]);

? ? ? ? ?break;


1 回復 有任何疑惑可以回復我~
#1

會飛的辣翔 提問者

出現死循環的可能是在if這里,你插入了兄弟節點后會改變oChild.length值,這樣每插一次就增加一次,沒完沒了的,但是代碼好像不是這樣執行的, var li=document.createElement('li'); li.innerHTML='php'; 這兩句從外面移植到if里,再去掉break就死了 ;這兩句在外面的時候即使沒有break也不會有問題,猜測和insertBefore運行規則(內存中已經存在某個元素時,只會插入一次,純屬猜想,并不知道是不是這樣的)有關系 !
2016-09-05 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

大家看看為什么我這個代碼去掉break也不會報錯,按說會陷入死循環的啊?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號