首先聲明床三,添加刪除線的都是不太確定的
下面我們分情況解釋:
1、函數(shù)調(diào)用模式--當(dāng)一個函數(shù)并非一個對象的屬性時廊驼,那么它就是被當(dāng)做函數(shù)來調(diào)用的郑临。在此種模式下栖博,this被綁定為全局對象,在瀏覽器環(huán)境下就是window對象,如下圖:
2.方法調(diào)用模式--當(dāng)函數(shù)被保存為一個對象的屬性時厢洞,它就可稱為這個對象的方法仇让。當(dāng)一個方法被調(diào)用時典奉,this被綁定到這個對象上。如果調(diào)用表達式包含一個提取屬性的動作(. 或 [])(下圖有實例)妹孙,那么它被稱為方法調(diào)用:
這里的this指向的對象是object秋柄,因為調(diào)用這個sayName()函數(shù)是通過object.sayName()執(zhí)行的获枝。
下面介紹一種分情況--對象中包含另一個對象:
通過以上兩種情況蠢正,我們可以得出結(jié)論:this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定省店,this最終指向調(diào)用它的對象嚣崭。
下面介紹一種特殊情況--設(shè)置全局變量,在全局環(huán)境下執(zhí)行懦傍,this指向window:
與上邊情況作比較:
3.構(gòu)造函數(shù)調(diào)用模式--如果在一個函數(shù)前面加上new關(guān)鍵字來調(diào)用雹舀,那么就會創(chuàng)建一個連接到該函數(shù)的prototype成員的新對象,同時粗俱,this會被綁定到這個新對象上说榆。這種情況下,這個函數(shù)就可以成為此對象的構(gòu)造函數(shù)寸认。此處需要用到的知識儲備:對象包括(數(shù)組签财、函數(shù)‘下一對象Object)。
實例一:在構(gòu)造函數(shù)偏塞,new出一個對象時唱蒸,this指向這個構(gòu)造函數(shù),new關(guān)鍵字會改變this的指向灸叼;
因為我認(rèn)為神汹,new并未改變指向,他指向的是a(new出的新對象)古今,而a此時本身是一個Object Fn{}屁魏。
實例二:當(dāng)用new關(guān)鍵字,返回的是一個對象捉腥,this指向的就是那個返回的對象氓拼;
以下為測試運行結(jié)果:
實例三:如果返回的不是對象,this還是指向函數(shù)的實例但狭,雖然null屬于對象披诗,但是返回null依然指向函數(shù)實例。只可意會立磁,不能言傳呈队,自己看區(qū)別吧,此時無聲勝有聲唱歧。