手写call、bind、apply

113 阅读1分钟

手写call、bind、apply

代码

1.apply

Function.prototype.myApply = function (context) {
  context = context === Object(context) ? context : window
  const tempFnKey = Symbol('tempFnKey')
  const args = [...arguments][1] || []
  context[tempFnKey] = this
  console.log(typeof context[tempFnKey], context[tempFnKey])
  const res = context[tempFnKey](...args)
  delete context[tempFnKey]
  return res
}

2.call

Function.prototype.myCall = function (context) {
  context = context === Object(context) ? context : window
  const tempFnKey = Symbol('tempFnKey')
  const args = [...arguments].slice(1)
  context[tempFnKey] = this
  console.log(typeof context[tempFnKey], context[tempFnKey])
  const res = context[tempFnKey](...args)
  delete context[tempFnKey]
  return res
}

3.bind

bind返回一个闭包(context被闭包锁定),因此bind是永久绑定,一旦绑定无法改变

Function.prototype.myBind = function (context) {
  context = context || window
  args = [...arguments].slice(1)
  const self = this
  return function () {
    return self.myApply(context, args.concat([...arguments]))
  }
}