js中apply、call、bind的區(qū)別

在javascript中call、apply與bind都用于改變this綁定

  • bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 ;
var name = "window";
let obj1 = {
  name: "Mitty"
}

let obj2 = {
  name: 'Jim'
}

function fn(addr) {
  console.log(this.name + '在' + addr);
}

// 這里的this指向的是 window
fn('瀏覽器');  // window在瀏覽器

// 改變this指向, apply、call立即調(diào)用
fn.apply(obj1, ['上海']);  // Mitty在上海
fn.call(obj1, '上海');   // Mitty在上海
// bind 是返回對(duì)應(yīng)函數(shù)
let bindFn = fn.bind(obj1);
bindFn('上海') // Mitty在上海 
  • apply、call再次調(diào)用時(shí)需要重新綁定; bind綁定后可以一直調(diào)用,強(qiáng)綁定;
// apply、call和bind的區(qū)別
// apply、call再次調(diào)用時(shí)需要重新綁定
fn.apply(obj1, ['上海']);  // Mitty在上海
fn.call(obj1, '上海');   // Mitty在上海

// bind綁定后可以一直調(diào)用,強(qiáng)綁定
bindFn('上海') // Mitty在上海 

  • bind綁定的返回函數(shù)無法再次更改this指向
// 并且無法再次更改this指向,嘗試為將bind綁定后的函數(shù)重新改變到obj2
bindFn.apply(obj2, ['北京']);  // Mitty在北京
bindFn.call(obj2, '北京');   // Mitty在北京
bindFn.bind(obj2)('北京'); // Mitty在北京

fn.apply(obj2, ['北京']);  // Jim在北京
fn.call(obj2, '北京');   // Jim在北京
fn.bind(obj2)('北京'); // Jim在北京

總結(jié)

  • call、apply與bind都用于改變this綁定,但call、apply在改變this指向的同時(shí)還會(huì)執(zhí)行函數(shù),而bind在改變this后是返回一個(gè)全新的boundFcuntion綁定函數(shù),這也是為什么上方例子中bind后還加了一對(duì)括號(hào) ()的原因。
  • bind屬于硬綁定,返回的 boundFunction 的 this 指向無法再次通過bind、apply或 call 修改;call與apply的綁定只適用當(dāng)前調(diào)用,調(diào)用完就沒了,下次要用還得再次綁。
  • call與apply功能完全相同,唯一不同的是call方法傳遞函數(shù)調(diào)用形參是以散列形式,而apply方法的形參是一個(gè)數(shù)組。在傳參的情況下,call的性能要高于apply,因?yàn)閍pply在執(zhí)行時(shí)還要多一步解析數(shù)組。
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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