🍿 手写call函数

手写 call 函数

call 函数的实现步骤:

1判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。

2判断传入上下文对象是否存在,如果不存在,则设置为 window 。

3处理传入的参数,截取第一个参数后的所有参数。

4将函数作为上下文对象的一个属性。

5使用上下文对象来调用这个方法,并保存返回结果。

6删除刚才新增的属性。

7返回结果。

// call函数实现
// context: this要指向的目标
Function.prototype.myCall = function(context) {

  // 判断调用对象
  if (typeof this !== "function") {
    console.error("type error");
  }
  
  // 判断 context 是否传入,如果未传入则设置为全局对象;其他情况Object()转为普通对象即可

  context = context ===null || context === undefined ? globalThis : Object(context);

  let result = null;

  // 将调用者函数,放到目标的属性当中去
  context.fn = this;

  // 就能调用调用者函数了,并且因为是目标调用的该函数,(谁调用,this就指向谁),所以this就成功指向了目标
  result = context.fn(...args);

  // 将属性删除
  delete context.fn;

  return result;
};