JavaScript中的call、apply、bind的使用和手動(dòng)實(shí)現(xiàn)

1、基本使用

call、apply、bind都是改變this的指向

  • call

// fn.call(this,params1,params2)  第一個(gè)參數(shù)指定this ,第二個(gè)往后依次是參數(shù)傳過(guò)來(lái)的參數(shù)
function fn(par1,par2){
  console.log(this.foo)  //bar
  console.log(par1)   //par1
  console.log(par2)   //par2
}
const obj = {
  foo:'bar'
}
fn.call(obj,'par1','par2') 
  • apply

//apply的用法跟call一樣,就是后面的參數(shù)格式不一樣,多個(gè)參數(shù)用數(shù)據(jù)傳遞
function fn(pars){
  console.log(this.foo)  //bar
  console.log(pars)   // [ 'par1', 'par2' ]
}
const obj = {
  foo:'bar'
}
fn.call(obj,['par1','par2'])
  • bind

//bind 函數(shù)不會(huì)變馬上調(diào)用  而是返回this被改變的新函數(shù)
function fn(par1,par2){
    console.log(this.foo)  //bar
    console.log(par1)   // 'par1'
    console.log(par2)   // 'par2'
  }
  const obj = {
    foo:'bar'
  }
  let newArr = fn.bind(obj,'par1','par2') 
  newArr()

2、手動(dòng)實(shí)現(xiàn)

  • call

Function.prototype.cl = function(context, ...params) {
  if (typeof context === 'object') {
    // 綁定當(dāng)前方法
    context.fn = this
  } else {
    context.fn = null
  }
  // 調(diào)用當(dāng)前方法
  context.fn(...params)
  delete context.fn
}

const obj = { foo: 'bar' }

function fn(p1, p2) {
  console.log(this.foo)
  console.log(p1, p2)
}
fn.cl(obj, 'p1', 'p2')
  • apply

Function.prototype.cl = function(context, ...params) {
  if (typeof context === 'object') {
    // 綁定當(dāng)前方法
    context.fn = this
  } else {
    context.fn = null
  }
  // 調(diào)用當(dāng)前方法
  context.fn(...params)
  delete context.fn
}

const obj = { foo: 'bar' }

function fn(p1, p2) {
  console.log(this.foo)
  console.log(p1, p2)
}
fn.cl(obj, 'p1', 'p2')
  • bind

Function.prototype.cl = function(context, ...params) {
  if (typeof context == 'object') {
    // 綁定當(dāng)前方法
    context.fn = this
  } else {
    context.fn = null
  }
  // 調(diào)用當(dāng)前方法
  context.fn(...params)
  delete context.fn
}

const obj = { foo: 'bar' }

function fn(p1, p2) {
  console.log(this.foo)
  console.log(p1, p2)
}
Function.prototype.bd = function(context){
  return (...params)=>{
    this.cl(context,...params)
  }
}
fn.bd(obj)('p1','p2')
?著作權(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)容