先來(lái)看一段代碼:
class testThis:
name = 'DeeJay'
def sayName(self):
print (self.name)
x = testThis()
x.sayName()
這段python代碼中侈百,testThis是一個(gè)類(lèi)诽俯,擁有name屬性和sayName()方法比原。
sayName()方法在調(diào)用的時(shí)候妥凳,輸出了testThis類(lèi)的name,我們注意到python中方法的第一個(gè)參數(shù)是self,這個(gè)self就類(lèi)似于JS中的this盗扇,不同的地方在于:python中的self是顯式的寫(xiě)在了參數(shù)列表當(dāng)中蜘拉,而JS缺在參數(shù)列表中隱藏掉了this遂唧。
怎么理解this
this可以理解為就是一個(gè)普通的參數(shù)夺脾,類(lèi)似于arguments[-1](當(dāng)然并不存在)之拨。
那么在函數(shù)調(diào)用的時(shí)候,就會(huì)傳一個(gè)this給當(dāng)前被調(diào)用函數(shù)咧叭。寫(xiě)一段類(lèi)似代碼:
let object = {
name: 'DeeJay',
sayName: function () {
console.log(this.name)
}
}
object.sayName()
我們可以看到區(qū)別敦锌。JS中隱藏了像sayName方法傳遞this的過(guò)程。其實(shí)在調(diào)用sayName的時(shí)候佳簸,sayName內(nèi)部的this就會(huì)傳達(dá)。我們使用call方法,就可以顯示的寫(xiě)出傳遞的this,比如上述例子寫(xiě)成object.sayName.call(object)
,這么寫(xiě)就可以理解this是在調(diào)用的時(shí)候確定的了生均。
對(duì)于如何確定this的值听想,所有的function調(diào)用都轉(zhuǎn)換為call寫(xiě)法,就很清晰明了马胧。
對(duì)于箭頭函數(shù)
上述說(shuō)的情況都是針對(duì)寫(xiě)了function關(guān)鍵字的情況汉买,在JS中,只要你寫(xiě)下了一個(gè)function佩脊,那么這個(gè)方法在被調(diào)用的時(shí)候一定是有this的蛙粘。
箭頭函數(shù)的出現(xiàn),就是為了弱化this威彰,箭頭函數(shù)本身很純粹出牧,沒(méi)有this的說(shuō)法(被調(diào)用的時(shí)候,沒(méi)有傳this的這種操作)歇盼,所以如果被調(diào)用的時(shí)候舔痕,內(nèi)部有this操作,就會(huì)尋求上一作用域中的this豹缀。
由于箭頭函數(shù)沒(méi)有this伯复,被調(diào)用時(shí)也沒(méi)有傳遞this的操作,所以箭頭函數(shù)中的this不是被調(diào)用的時(shí)候確定的邢笙,而是寫(xiě)下代碼的時(shí)候(函數(shù)定義的時(shí)候)就已經(jīng)確定了啸如。
基于上述內(nèi)容,想在箭頭函數(shù)中使用this的話氮惯,最好顯示的規(guī)定一個(gè)this叮雳,傳入想要的this進(jìn)行調(diào)用。
let obj = {
name: 'DeeJay',
say: (self)=> {
console.log(self.name)
}
}
obj.say(obj) // 顯式的傳入想要的context