this的指向是不確定的匾竿,可以動(dòng)態(tài)改變瓦宜,這樣設(shè)計(jì)可以讓代碼更加靈活,復(fù)用性也更高岭妖,由于this的指向是不確定的临庇,如果在有些情況下反璃,我們需要確定this是什么該怎么辦呢,我們可以用apply
假夺,call
淮蜈,bind
來改變函數(shù)的this對(duì)象的指向。
先看看 apply
已卷,call
梧田,bind
的相似之處:
- 都是用來改變函數(shù)的this對(duì)象的指向的。
- 第一個(gè)參數(shù)都是this要指向的對(duì)象侧蘸。
- 都可以利用后續(xù)參數(shù)傳參
如何使用apply
裁眯,call
,bind
var xxxInfo = {
name: 'xxx',
age: 22,
say: function (){
console.log(this.name + '今年' + this.age + '歲')
}
}
var cccInfo = {
name: 'ccc',
age: '26'
}
xxxInfo.say()
那么如何用xxx的say方法來顯示ccc的數(shù)據(jù)呢讳癌。
我們可以這樣
var xxxInfo = {
name: 'xxx',
age: 22,
say: function (){
console.log(this.name + '今年' + this.age + '歲')
}
}
var cccInfo = {
name: 'ccc',
age: '26'
}
xxxInfo.say.call(cccInfo)//call
xxxInfo.say.apply(cccInfo)//apply
xxxInfo.say.bind(cccInfo)()//bind
首先我們執(zhí)行了xxxInfo的say方法穿稳,然后讓里面的 this 指向cccInfo,這里注意晌坤,call和apply都是對(duì)函數(shù)的直接調(diào)用逢艘,而bind方法返回的仍然是一個(gè)函數(shù),因此后面還需要()來進(jìn)行調(diào)用才可以骤菠。
其實(shí)apply
它改,call
,bind
除了傳遞 this 指向?qū)ο笾馍毯酰€可以接受別的參數(shù)央拖,我們就上個(gè)例子來改寫一下代碼
var xxxInfo = {
name: 'xxx',
age: 22,
sayHi: function (sex){
console.log(this.name + ',' + sex + ',今年' + this.age + '歲')
}
}
var cccInfo = {
name: 'ccc',
age: '26'
}
xxxInfo.sayHi.call(cccInfo,'male')
xxxInfo.sayHi.apply(cccInfo,['male'])
xxxInfo.sayHi.bind(cccInfo)('male')
call
后面的參數(shù)與say方法中是一一對(duì)應(yīng)的,
而 apply
的第二個(gè)參數(shù)是一個(gè)數(shù)組鹉戚,數(shù)組中的元素是和say方法中一一對(duì)應(yīng)的爬泥,
而 bind
其實(shí)可以像 call
一樣傳遞參數(shù),不過由于bind返回的仍然是一個(gè)函數(shù)崩瓤,所以我們還可以在調(diào)用的時(shí)候再進(jìn)行傳參袍啡。
以上就是我對(duì) apply
,call
却桶,bind
之間的總結(jié)境输。