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

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

在鼠標遍歷的時候為什么必須用this?

????for(var?i=0;i<as.length;i++){
????	as[i].onmouseover=function(){
????		this.style.background='grey';//這里用as[i]代替this就不會改變背景色
????	}
????	as[i].onmouseout=function(){
????		this.style.background='none';
????	}????	
????	as[i].onclick=function(){
????		title.innerHTML=this.innerHTML;
????	}
????}

在這段程序里,既然this指當前事件的對像as[i],為什么不能用as[i].style.background='grey';來取代this呢?

正在回答

3 回答

問題在于:對于變量的作用域混淆,原因:當 onmouseover 事件執行函數時,它不認識 as[i] 是什么東西;

首先明確一點:this是指對當前對象的引用,這是JS語法規定。

從你的代碼可以看出,this是指?li 對象(假定你的 as[i] 是一個 li 對象),而 onmouseover 調用的是匿名方法,即onmouseover=function(){...},這是簡寫,語法規定可以這么寫:

as[i].onmouseover=function(){
????this.style.background='grey';//這里用as[i]代替this就不會改變背景色
}

現在,我們把它的具體引用寫出來,假定這個方法被聲明為 changBg(),那么就是:

as[i].onmouseover=changeBg();

function?changeBg(){
????this.style.background='grey';//this是指對當前對象的引用,這是JS語法規定。
}

//當我們?this?改為?as[i]?的時候,
function?changeBg(){
????as[i].style.background='grey';//?as[i]?在這個方法內是什么?as[i]?既不是全局變量,也不是方法內的局部變量,所以它不會被識別出來,從而導致這條代碼無法實現功能
}

當然,我也是初學者,以上是我的理解,不敢保證100%正確,希望能幫到你。: )

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

二師弟 提問者

哦哦哦哦哦!雖然還不太明白變量的作用域混淆是怎么一回事,但是你后面這么一說,突然就明白了一些!好厲害!謝謝你~
2016-03-31 回復 有任何疑惑可以回復我~
#2

latency

不是這個原因,下面FANR說的才是正確原因
2016-08-05 回復 有任何疑惑可以回復我~

這與閉包有關,i是綁定在其作用域所在的函數,在循環的額每次迭代中,循環體都會為嵌套函數(這里是mouseover的事件處理程序)創建一個閉包,而閉包存儲的是變量i的引用,由于每次迭代后,i的值均在變化,因此內部函數最終得到的就是i最后的值(as.length)。

參考這個問題:https://segmentfault.com/q/1010000002959308

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

因為這個不是按下鍵盤再進行循環的,是先進行循環對所有對象添加了事件然后你再進行操作調用這個事件,當你按下事件的時候循環中的i值已經大于as.length了

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

舉報

0/150
提交
取消

在鼠標遍歷的時候為什么必須用this?

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

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

幫助反饋 APP下載

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

公眾號

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