手写bind和call

37 阅读1分钟

bind

  1. 首先bind可以通过apply或call来实现,其实就是一个简单的闭包保存函数本身的一些状态,然后返回一个修改之后的函数
  2. 要支持预置参数
  3. 要判断传入的是否是函数,进行报错
Function.prototype.mybind = function(obj,...pre){
    //let fn = this
    if(!(fn instanceof Function)){
        throw Error('...')
    }
    return (...end)=>{
        // fn.apply(obj,pre)
        this.apply(obj,[...pre,...end])
    }
}

call

  1. 利用function的this指向调用者的特性
  2. 给obj添加被调用的函数
  3. obj.func()调用函数
  4. delete obj.func
Function.prototype.mycall = function(obj,...arg){
     obj.temp = this;
     obj.temp(...arg);
     delete obj.temp
}