call和apply的区别就是第二个参数 call是返回无数个参数拼接而apply是传入一个类数组

关于手写call和apply主要就是考验this的指向问题

这里有一个注意点:
在非严格环境下,如果call和apply的第一个参数是null或者是undefined则this指向window

es6实现call

Function.prototype.myCall = function (obj, ...args) {
  // 数据校验
  if ([undefined, null].includes(obj)) {
    obj = window
  } else {
    obj = Object(obj) //如果是简单数据类型,则使用他的包装对象包装一层
  }

  //存储一下当前函数
  const fn = this
  // 将当前函数绑定到要执行的对象的某个属性上,这样一来直接调用对象的属性,则就可以完成this指向
  // 创建一个独一无二的基础数据类型,防止污染到obj
  const methods = Symbol('methods')
  // 将这个方法绑定到obj的methods属性上
  obj[methods] = fn
  delete obj[methods]; //删除临时方法
  return obj[methods](...args)
}
Last modification:March 10, 2021
If you think my article is useful to you, please feel free to appreciate