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

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

求助,關于for循環中的函數

?for(var i= 0,len = xli.length;i<len;i++){

xxx(i);

}

function xxx(i){

xli[i].onclick=function(){

for(var n= 0;n<len;n++){

? ? ? ? ? ? ? ? ? ? ? ? ?xli[n].className = "";

? ? ? ? ? ? ? ? ? ? ? ? ?xDivs[n].className = "cont";

}

xli[i].className = "on";

xDivs[i].className="";

}?

? ?}

}

如上代碼是可行的。但是將xxx這個函數替換掉xxx(i)位置就不可行了。什么原因呢?

正在回答

4 回答

for(var i= 0,len = xli.length;i<len;i++){

? ?xli[i].onclick=function(){

? ? ? ?for(var n= 0;n<len;n++){

? ? ? ? ? ?xli[n].className = "";

? ? ? ? ? ?xDivs[n].className = "cont";

? ? ? ?}

? ? ? ?xli[i].className = "on";

? ? ? ?xDivs[i].className="";

? ?}

}這是你想改成的代碼吧


先說一下for循環的時候做了什么吧,給每一個li綁定了一個onclick事件,然后for循環就結束了


,到這里一切都正常


問題出在onclick觸發時,


xli[i].className = "on";


xDivs[i].className="";


執行上述2個語句,i是多少,由于本身onclick事件綁定的匿名函數里沒有i的相關定義,按照作


用域鏈,向上一級查找i,這時在for循環里找到i的定義,此時i是多少呢,由于for循環早就跑完


了,onclick事件也早綁完了,所以i是len-1,到此,就錯誤了。


那么提問那種方法為什么沒錯,因為把i作為參數,在傳參的過程中給保存了,每一個li對應的i


值都被保存了,保存在函數xxx的參數i里,防止2個i你分不清楚,我給改寫一下你看的明白。


function xxx(obj){//參數obj保存了當時i的值


xli[i].onclick=function(){//綁定事件時,i向上從for循環里取當時的i值


for(var n= 0;n<len;n++){


? ? ? ? ? ? ? ? ? ? ? ? ?xli[n].className = "";


? ? ? ? ? ? ? ? ? ? ? ? ?xDivs[n].className = "cont";


}


xli[obj].className = "on";//觸發事件后,找obj的值,向上一級查找,找到參數obj,值為當時i的



xDivs[obj].className="";


}?


? ?}


到此,就是說,想要不出現i值錯誤,就要保存一下i值,上面那種作為參數保存是一種,標準答


案提供的是另一種


for(var i= 0,len = xli.length;i<len;i++){

? ?xli[i].obj=i;//給li自定義了一個obj屬性,保存當時的i值,每一個li都有一個obj屬性,來


保存對應的i值

? xli[i].onclick=function(){

? ? ? ?for(var n= 0;n<len;n++){

? ? ? ? ? ?xli[n].className = "";

? ? ? ? ? xDivs[n].className = "cont";

? ? ? }

? ? ? ?this.className = "on";//this為觸發onclick的li

? ? ? ?xDivs[this.obj].className="";//this.obj值為觸發onclick的li當時的i值

? }

}


還有很多種方法,比如i值保存在函數屬性里,比如i值保存在一個局部變量里,重點都在于把每


個li對應的i值給保存住,js有一個重要知識點叫做閉包,也可以用來保存i值,這里不做多講,


可以自己查詢了解一下。


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

Original121 提問者

非常感謝!for循環跑完后i應該等于len吧?
2016-05-03 回復 有任何疑惑可以回復我~
#2

kuban 回復 Original121 提問者

for內最后一個i是len-1,出去就是len了 for循環,滿足第二條件執行花括號內內容,執行完畢i再加1,所以最后一個for花括號內的i值是len-1,執行完畢時是len,不符合for循環第二條件,不再進入循環,下面附一小段代碼,可以給你自己嘗試一下看值。
2016-05-03 回復 有任何疑惑可以回復我~

這時在for循環里找到i的定義,此時i是多少呢,由于for循環早就跑完


了,onclick事件也早綁完了,所以i是len-1,到此,就錯誤了。

就是這句話,不是很明白。。。

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

for(var i= 0,len = xli.length;i<len;i++){

? ?xli[i].onclick=function(){

? ? ? ?for(var n= 0;n<len;n++){

? ? ? ? ? ?xli[n].className = "";

? ? ? ? ? ?xDivs[n].className = "cont";

? ? ? ?}

? ? ? ?xli[i].className = "on";

? ? ? ?xDivs[i].className="";

? ?}

}這是你想改成的代碼吧

這個i并沒有執行完吧,都是從0開始的呀。xli[0],xli[1]....依次往后的呀

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

<!DOCTYPE html>
<html>
<head lang="en">
? ?<meta charset="UTF-8">
? ?<title></title>
</head>
<body>
for循環內的i值:<input class="f1" /><br>
for循環外的i值:<input class="f2" />
<script>
? ?(function a(){
? ? ? ?for(var i=0;i<5;i++)
? ? ? ?{
? ? ? ? ? ?var f1=document.getElementsByClassName("f1");
? ? ? ? ? ?f1[0].value=i;
? ? ? ?}
? ? ? ?var f2=document.getElementsByClassName("f2");
? ? ? ?f2[0].value=i;
? ?})();
</script>
</body>
</html>

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

Original121 提問者

嗯,thank you
2016-05-03 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
JavaScript進階篇
  • 參與學習       468832    人
  • 解答問題       22582    個

本課程從如何插入JS代碼開始,帶您進入網頁動態交互世界

進入課程

求助,關于for循環中的函數

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

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

幫助反饋 APP下載

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

公眾號

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