call、apply、bind的作用是改變函數(shù)運(yùn)行時(shí)this的指向。
-
call()的第一個(gè)參數(shù)為this綁定的對(duì)象,后面?zhèn)魅?strong>一串參數(shù)列表。
當(dāng)?shù)谝粎?shù)為null或undefined時(shí),默認(rèn)指向window對(duì)象。 -
apply()和call()類似,唯一的不同點(diǎn)在于第二個(gè)參數(shù)傳入一個(gè)參數(shù)數(shù)組。
當(dāng)?shù)谝粎?shù)為null或undefined時(shí),默認(rèn)指向window對(duì)象。 -
bind()和call()類似,不同點(diǎn)一bind()不會(huì)立即執(zhí)行,而是返回一個(gè)改變了this后的函數(shù);
不同點(diǎn)二在于當(dāng)你調(diào)用fn1 = fn.bind(newThis,param1)方法后,執(zhí)行fn2(prama2)時(shí),參數(shù)prama2會(huì)加到param1后面。
示例代碼:
let obj1 = {
name: 'obj1',
fn1(param) {
console.log(this.name, param);
}
}
let obj2 = {
name: 'obj2',
fn1(param) {
console.log(this.name, param);
}
}
//一般調(diào)用
obj1.fn1('param1') //輸出 obj1 param1
//call的第一參數(shù)為調(diào)用該函數(shù)的對(duì)象時(shí),等價(jià)于一般調(diào)用
obj1.fn1.call(obj1, 'param1') //輸出 obj1 param1
//改變this指針,指向obj2
obj1.fn1.call(obj2, 'param1') //輸出 obj2 param1
//apply的第二個(gè)參數(shù)為參數(shù)數(shù)組
obj1.fn1.apply(obj2, ['param1']) //輸出 obj2 param1
//bind方法返回一個(gè)函數(shù),但不會(huì)執(zhí)行,這個(gè)函數(shù)的參數(shù)繼承bind方法的參數(shù)
let fun = obj1.fn1.bind(obj2, 'param')
fun() //輸出 obj2 param1