在鼠標遍歷的時候為什么必須用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呢?
2016-03-30
問題在于:對于變量的作用域混淆,原因:當 onmouseover 事件執行函數時,它不認識 as[i] 是什么東西;
首先明確一點:this是指對當前對象的引用,這是JS語法規定。
從你的代碼可以看出,this是指?li 對象(假定你的 as[i] 是一個 li 對象),而 onmouseover 調用的是匿名方法,即onmouseover=function(){...},這是簡寫,語法規定可以這么寫:
現在,我們把它的具體引用寫出來,假定這個方法被聲明為 changBg(),那么就是:
當然,我也是初學者,以上是我的理解,不敢保證100%正確,希望能幫到你。: )
2018-01-20
這與閉包有關,i是綁定在其作用域所在的函數,在循環的額每次迭代中,循環體都會為嵌套函數(這里是mouseover的事件處理程序)創建一個閉包,而閉包存儲的是變量i的引用,由于每次迭代后,i的值均在變化,因此內部函數最終得到的就是i最后的值(as.length)。
參考這個問題:https://segmentfault.com/q/1010000002959308
2016-03-30
因為這個不是按下鍵盤再進行循環的,是先進行循環對所有對象添加了事件然后你再進行操作調用這個事件,當你按下事件的時候循環中的i值已經大于as.length了