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