call()方法的实现

call()方法的实现

let name = "五六七"
function test(a,b){
  console.log(this.name)
  console.log(a+b)
}

const person = {
  name : "暗影刺客"
}

Function.prototype.myCall = function(obj) {
  if(typeof this !== 'function'){
    throw new Error('not a function')
  }
  obj = obj || window
  obj.p = this
  let res = arguments[1]?obj.p(...Object.values(arguments).slice(1)):obj.p() // 切割参数的代码也可以这样实现 Array.prototype.slice.call(arguments,1)
delete obj.p
  return res
}

test.myCall(person,2,3)

apply():和call基本上一致,唯一区别在于传参方式,具体来说apply把需要传递给fn的参数放到一个数组(或者类数组)中传递进去,虽然写的是一个数组,但是也相当于给fn一个个的传递

bind():语法和call一模一样,区别在于立即执行还是等待执行,bind方法的返回值是函数。

 

posted @ 2021-12-24 09:10  凉之光ca  阅读(86)  评论(0)    收藏  举报