一般來說,this的指向是指誰調(diào)用的方法this就是指向誰(這句話有些問題蚣驼,后面會解釋為什么會有問題雳窟,雖然網(wǎng)上大部分的文章都是這樣說的,雖然在很多情況下那樣去理解不會出什么問題典予,但是實際上那樣理解是不準(zhǔn)確的,所以在理解this的時候會有種琢磨不透的感覺)
例子1:
function a(){
? ?var obj="哈哈哈"乐严;
? ?console.log(this.obj)瘤袖;//undefined
? ?console.log(this);//window
}
a();
按照上面的說法這里的this最終指向的是調(diào)用它的對象昂验,由于這里的函數(shù)a是被window對象調(diào)用的捂敌,所以?console.log(this)的時候打印出window,而?console.log(this.obj)的時候由于obj參數(shù)只存在于函數(shù)a里面既琴,而window下并沒有obj參數(shù)占婉,所以打印出來是undefined
function a(){
? ?var obj="哈哈哈";
? ? console.log(this.obj); //undefined
? ? console.log(this); //Window
}
window.a();
這段代碼就可以看出來和上面的代碼的執(zhí)行結(jié)果是一樣的甫恩。
例子2:
var o = {
? ? obj:"哈哈哈",
? ? fn:function(){
? ? ? ? console.log(this.obj);//哈哈哈?
? ? ?}
}
o.fn();
還是通過上面的結(jié)論逆济,由于函數(shù)fn是通過o.fn()執(zhí)行的,那自然指向就是對象o,而對象o中確實是存在obj的奖慌,所以打印出來就是對象o里面的obj的內(nèi)容也就是‘哈哈哈’霎终,同時從這里我們也能看出來,this的指向在函數(shù)創(chuàng)建的時候是決定不了的升薯,只有在函數(shù)調(diào)用的時候才能決定莱褒,誰調(diào)用的就指向誰,這一點是很重要的涎劈,一定要記住广凸。
但是要搞清楚this還要看接下來的幾個例子:
例子3:
var o = {
? ? obj:"哈哈哈",
? ? fn:function(){
? ? ? ? console.log(this.obj);//哈哈哈?
? ? ?}
}
window.o.fn();
例子3幾乎和例子2是一樣的,只是最后一句在調(diào)用函數(shù)的時候不太相同蛛枚,但是通過打印的結(jié)果可以看出來谅海,這里的this指向的還是對象o,如果按照一開始的理論蹦浦,this指向的調(diào)用它的對象扭吁,那這里應(yīng)該是指向window對象,為什么沒有呢盲镶?侥袜??(ps:window是js中的全局對象溉贿,我們創(chuàng)建的變量實際上是給window添加屬性枫吧,所以這里可以用window.o.fn來調(diào)用函數(shù))
在解釋這為什么不指向window之前,我們再來看一段代碼:
var o = {
? ? a:10,
? ? ?b:{
? ? ? ? ? ? a:20;
? ? ? ? ? ? fn:function(){
? ? ? ? ? ? ? ? ? ? ? console.log(this.obj);//20
? ? ? ? ? ? ?}
? ? ? ? }
}
o.b.fn();
這里同樣是對象o調(diào)用的函數(shù)fn宇色,但是同樣的九杂,this對象也沒有指向o,而是指向?qū)ο骲宣蠕,是因為我們一開始說的誰調(diào)用的方法this就是指向誰是錯誤的嗎例隆,其實也不是,只是說的不準(zhǔn)確抢蚀,所以要對這個結(jié)論進(jìn)行補充镀层,才能徹底的理解this的指向問題。
情況1:如果一個函數(shù)中有this思币,但是它沒有被上一級的對象所調(diào)用鹿响,那么this指向的就是window羡微。
情況2:如果一個函數(shù)中有this谷饿,這個函數(shù)有被上一級函數(shù)所調(diào)用,那么this指向的就是上一級的對象妈倔。
情況3:如果一個函數(shù)中有this博投,這個函數(shù)中包含多個對象,盡管這個函數(shù)是被最外層的對象所調(diào)用盯蝴,this指向的也只是它上一級的對象毅哗。
所以這也就解釋了上面的例子3听怕,在例子3中,雖然最后一句是window.o.fn()虑绵,看上去是window調(diào)用的fn尿瞭,但是實際上this對象并不指向window而是指向函數(shù)fn的上一級的對象o。下面這個例子就是一個很好的證明翅睛。
var o = {
? ? a:10,
? ? ?b:{
? ? ? ? ? ?// a:20;
? ? ? ? ? ? fn:function(){
? ? ? ? ? ? ? ? ? ? ? console.log(this.obj);//undefined
? ? ? ? ? ? ?}
? ? ? ? }
}
o.b.fn();
這里可以看到声搁,盡管對象b中沒有屬性a,這里的this也是指向?qū)ο骲捕发,因為this只會指向它的上一級對象疏旨,不管這個對象中有沒有this要的東西。