call、apply、bind 的用法

紅寶書(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)用 。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容