前面的課程中講解了兩種情況下的函數(shù)this指向,全局this和成員方法this都是屬于被動(dòng)this,即默認(rèn)設(shè)置的。
在JavaScript中,可以主動(dòng)設(shè)置函數(shù)執(zhí)行時(shí)的this變量,以覆蓋掉默認(rèn)設(shè)置。
call方法
每一個(gè)JavaScript函數(shù)對(duì)象都有一個(gè)call方法,通過(guò)call方法可以在指定的this來(lái)調(diào)用此函數(shù)。call方法參數(shù)如下:
func.call(this, ...args)
其中第一個(gè)參數(shù)是函數(shù)func執(zhí)行時(shí)的this,this后面的參數(shù)將會(huì)保持原樣的傳給func。
我們通過(guò)一個(gè)例子來(lái)理解一下:
function setAge(aAge)
{
this.age = aAge
}
var student = {}
console.log(student.age) // 函數(shù)執(zhí)行前輸出
setAge.call(student, 18) // this參數(shù)被設(shè)置為student
console.log(student.age) // 函數(shù)執(zhí)行后輸出
上述代碼中,setAge函數(shù)體本身與student對(duì)象無(wú)關(guān),它只是將this的age屬性設(shè)置為aAge。
我們來(lái)看一下運(yùn)行結(jié)果:

可以看到,setAge.call()執(zhí)行前,student.age為undefined; setAge.call()執(zhí)行后,student.age為18。這說(shuō)明setAge.call()方法成功改變了student對(duì)象的屬性。
apply方法
除了call方法外,JavaScript中所有函數(shù)對(duì)象還一個(gè)apply方法,其作用與call類(lèi)似。惟一的區(qū)別是apply方法將所有參數(shù)是數(shù)組的形式傳入。apply語(yǔ)法如下:
func.apply(this, argsArray) // argsArray為一個(gè)Array對(duì)象
讓我們用apply來(lái)改寫(xiě)一下上面的函數(shù):
function setAge(aAge)
{
this.age = aAge
}
var student = {}
console.log(student.age)
// setAge.call(student, 18)
setAge.apply(student, [18]) // 使用apply
console.log(student.age)
可以看到,setAge.call替換成了setAge.apply,另外第二個(gè)參數(shù)由18變成了[18]。讓我們看一下運(yùn)行結(jié)果:

OK,完事。
什么是bind()?
什么是繼承?