this最終指向的是調(diào)用它的那個(gè)對(duì)象
1漩仙、在普通函數(shù)里的this指向
例子1:
運(yùn)行結(jié)果:
這里的this最終指向window志衍,因?yàn)檫@里是window調(diào)用的findThis()方法
例子2:
運(yùn)行結(jié)果:
這里的this指向findThis望门,因?yàn)檫@里是findThis調(diào)用的logName()方法
注意:this的指向在函數(shù)創(chuàng)建的時(shí)候是決定不了的辛润,在調(diào)用的時(shí)候才能決定杜秸,誰(shuí)調(diào)用就指向誰(shuí)结耀。
例子3:
運(yùn)行結(jié)果:
這里的this和例子2的this的指向是一樣的,都是指向findThis崎脉,因?yàn)檫@里是window下面的findThis屬性直接調(diào)用的logName()方法,而不是window直接調(diào)用的拧咳,所以這里的this指向的是findThis
例子4:
運(yùn)行結(jié)果:
可以發(fā)現(xiàn),同樣是通過(guò)findThis點(diǎn)出來(lái)的囚灼,但是這里的this指向的卻是age而不是findThis骆膝,對(duì)比上方的幾個(gè)例子,你會(huì)更加能理解this的指向問題灶体。
例子5:
運(yùn)行結(jié)果:
這里的this指向window阅签,如果懵了的話,就說(shuō)明蝎抽,你還未理解這句話:this指向的永遠(yuǎn)是最后調(diào)用它的那個(gè)對(duì)象政钟,也就是看它執(zhí)行的時(shí)候是誰(shuí)調(diào)用的。雖然logName()是被對(duì)象age所引用樟结,但是在將它賦值給變量b的時(shí)候并沒有執(zhí)行這個(gè)方法养交,而是賦值之后才通過(guò)window來(lái)調(diào)用的,所以這里的this指向的是window瓢宦。
總結(jié):
- 如果一個(gè)函數(shù)中有this碎连,但是它沒有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是window刁笙。
- 如果一個(gè)函數(shù)中有this破花,這個(gè)this被上一級(jí)的對(duì)象所調(diào)用,那么this就指向上一級(jí)的對(duì)象疲吸。
- 如果一個(gè)函數(shù)中有this座每,這個(gè)函數(shù)中包含多個(gè)對(duì)象,盡管這個(gè)函數(shù)是否被最外層的對(duì)象所調(diào)用摘悴,this指向的也只是它的上一級(jí)的對(duì)象峭梳。
2、在構(gòu)造函數(shù)里的this指向
例子1:
運(yùn)行結(jié)果:
這里的對(duì)象b可以點(diǎn)出函數(shù)FindThis()里面的names是因?yàn)閚ew關(guān)鍵字可以改變this的指向蹂喻,將這個(gè)this指向了對(duì)象b(new關(guān)鍵字就是創(chuàng)建了一個(gè)實(shí)例對(duì)象葱椭,相當(dāng)于把FindThis復(fù)制了一份到b里面),此時(shí)僅僅是創(chuàng)建而已口四,并沒有執(zhí)行孵运,而調(diào)用FindThis()方法的是對(duì)象b,所以this指向?qū)ο骲蔓彩,所以可以打印出names治笨。
當(dāng)this遇到return:
例子:
比較上面的幾個(gè)例子,會(huì)發(fā)現(xiàn):如果返回值是一個(gè)對(duì)象赤嚼,那么this指向的就是那個(gè)返回的對(duì)象旷赖,如果返回值不是一個(gè)對(duì)象,那么this還是指向函數(shù)的實(shí)例
特殊情況:null雖然也是對(duì)象更卒,但是在這里this還是指向那個(gè)函數(shù)的實(shí)例對(duì)象
例子:
3等孵、綁定事件的this指向
例子:
運(yùn)行結(jié)果:
這里的this指向的是<button id="btn">按鈕</button>,得出的結(jié)論:元素綁定事件蹂空,事件觸發(fā)后俯萌,執(zhí)行的函數(shù)中的this指向的是當(dāng)前元素
4、定時(shí)器中的this指向
例子1:
運(yùn)行結(jié)果:
例子2:
運(yùn)行結(jié)果:
這里的this都是指向window上枕,得出結(jié)論:定時(shí)器中的this绳瘟,指向的是window
5、綁定了bind的函數(shù)中的this指向
例子:
運(yùn)行結(jié)果:
得出結(jié)論:函數(shù)調(diào)用時(shí)如果綁定了bind姿骏,那么函數(shù)中的this指向了bind中綁定的元素