紅寶書(shū)上定義:每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)(即在構(gòu)造函數(shù)Function的 prototype)的方法。apply()和call(),在特定的作用域上調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值。
apply()方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是運(yùn)行該函數(shù)的作用域(即調(diào)用該函數(shù)的對(duì)象),第二個(gè)參數(shù)是函數(shù)參數(shù)數(shù)組。
call()第一個(gè)參數(shù)和apply()一樣,從第二個(gè)參數(shù)開(kāi)始,是傳遞給函數(shù)的所有參數(shù)
var name = 'aaa'//全局變量name
function sayHi(a, b) {
console.log(this.name + ',你好!說(shuō)' + a + ',' + b)
}
var o = {
name: 'bbb'
}
sayHi.call(this, 1, 2)//全局作用域下調(diào)用,this默認(rèn)指向Window
sayHi.call(o, 1, 2)//將this指向o
sayHi.apply(this, [1, 2])
sayHi.apply(o, [1, 2])

call和apply.png
bind()會(huì)創(chuàng)建一個(gè)函數(shù)實(shí)例,this的值會(huì)被綁定到傳給bind()的值。bind的第一個(gè)參數(shù)和call apply 一樣指定執(zhí)行上下文,從第二個(gè)參數(shù)開(kāi)始和call 一樣,順序傳入函數(shù)的參數(shù)。
var newSayHi = sayHi.bind({ name: 'ccc' }, 1, 2)
newSayHi()

bind.png
sayHi.bind({ name: 'ccc' }, 1, 2)將新的ccc對(duì)象傳給了this,即使在全局作用域下調(diào)用newSayHi也能將this指向ccc
總結(jié)
- 三者都是可以用來(lái)改變函數(shù)的this對(duì)象的指向,都可以利用后續(xù)參數(shù)傳參;
- bind 是返回this改變指向的函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。