实现call方法

114 阅读1分钟
    //实现call方法
    Function.prototype.myCall = function (context, ...rest) {
      //对于context为null或者没传时的处理
      context = context || window;
      // 将当前的this 暂存于context对象中。此时的this为封装类将来要绑定的函数的原型对象,下面调用的getName方法挂在this.prototype上。
      context.fn = this;
      // 以context对象上的属性的方式执行函数(此时触发隐式绑定)
      let ret = context.fn(...rest);
      //将挂在上面的中间属性fn 删除。其作用只是为了帮助我们改变this,同时执行函数所用。
      delete context.fn;
      return ret;
    }
    let obj = {
      name: 1
    }

    function getName(a, b, c) {
      return this;
    }
    let ret = getName.myCall(obj, 2, 3, 4);
    console.log(ret);