求助,關(guān)于for循環(huán)中的函數(shù)
?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這個(gè)函數(shù)替換掉xxx(i)位置就不可行了。什么原因呢?
2016-05-03
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循環(huán)的時(shí)候做了什么吧,給每一個(gè)li綁定了一個(gè)onclick事件,然后for循環(huán)就結(jié)束了
,到這里一切都正常
問題出在onclick觸發(fā)時(shí),
xli[i].className = "on";
xDivs[i].className="";
執(zhí)行上述2個(gè)語句,i是多少,由于本身onclick事件綁定的匿名函數(shù)里沒有i的相關(guān)定義,按照作
用域鏈,向上一級(jí)查找i,這時(shí)在for循環(huán)里找到i的定義,此時(shí)i是多少呢,由于for循環(huán)早就跑完
了,onclick事件也早綁完了,所以i是len-1,到此,就錯(cuò)誤了。
那么提問那種方法為什么沒錯(cuò),因?yàn)榘裪作為參數(shù),在傳參的過程中給保存了,每一個(gè)li對(duì)應(yīng)的i
值都被保存了,保存在函數(shù)xxx的參數(shù)i里,防止2個(gè)i你分不清楚,我給改寫一下你看的明白。
function xxx(obj){//參數(shù)obj保存了當(dāng)時(shí)i的值
xli[i].onclick=function(){//綁定事件時(shí),i向上從for循環(huán)里取當(dāng)時(shí)的i值
for(var n= 0;n<len;n++){
? ? ? ? ? ? ? ? ? ? ? ? ?xli[n].className = "";
? ? ? ? ? ? ? ? ? ? ? ? ?xDivs[n].className = "cont";
}
xli[obj].className = "on";//觸發(fā)事件后,找obj的值,向上一級(jí)查找,找到參數(shù)obj,值為當(dāng)時(shí)i的
值
xDivs[obj].className="";
}?
? ?}
到此,就是說,想要不出現(xiàn)i值錯(cuò)誤,就要保存一下i值,上面那種作為參數(shù)保存是一種,標(biāo)準(zhǔn)答
案提供的是另一種
for(var i= 0,len = xli.length;i<len;i++){
? ?xli[i].obj=i;//給li自定義了一個(gè)obj屬性,保存當(dāng)時(shí)的i值,每一個(gè)li都有一個(gè)obj屬性,來
保存對(duì)應(yīng)的i值
? xli[i].onclick=function(){
? ? ? ?for(var n= 0;n<len;n++){
? ? ? ? ? ?xli[n].className = "";
? ? ? ? ? xDivs[n].className = "cont";
? ? ? }
? ? ? ?this.className = "on";//this為觸發(fā)onclick的li
? ? ? ?xDivs[this.obj].className="";//this.obj值為觸發(fā)onclick的li當(dāng)時(shí)的i值
? }
}
還有很多種方法,比如i值保存在函數(shù)屬性里,比如i值保存在一個(gè)局部變量里,重點(diǎn)都在于把每
個(gè)li對(duì)應(yīng)的i值給保存住,js有一個(gè)重要知識(shí)點(diǎn)叫做閉包,也可以用來保存i值,這里不做多講,
可以自己查詢了解一下。
2016-06-23
這時(shí)在for循環(huán)里找到i的定義,此時(shí)i是多少呢,由于for循環(huán)早就跑完
了,onclick事件也早綁完了,所以i是len-1,到此,就錯(cuò)誤了。
就是這句話,不是很明白。。。
2016-06-23
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="";
? ?}
}這是你想改成的代碼吧
這個(gè)i并沒有執(zhí)行完吧,都是從0開始的呀。xli[0],xli[1]....依次往后的呀
2016-05-03
<!DOCTYPE html>
<html>
<head lang="en">
? ?<meta charset="UTF-8">
? ?<title></title>
</head>
<body>
for循環(huán)內(nèi)的i值:<input class="f1" /><br>
for循環(huán)外的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>