前端常用方法——call、apply、bind的简易实现

前端常用方法——call、apply、bind的简易实现

场景

​ call, apply,bind可以改变this的指向,利用es6的语法我们可以很简便的实现call,apply,bind

  • 用call时,第一个参数为想调用的对象,第二个以及以后为函数调用时的参数,实现如下

    Function.prototype.myCall = function(self,...args){
      self = self || globalThis
      self.fn = this
      let result = self.fn(...args)
      delete self.fn
      return result
    }
    

    首先为self做判断处理,为null或undefined时等于的是window,self.fn 指向的是当前的函数

    result为当前函数调用后返回的结果,函数调用时需要的参数为myCall后的第二个以及以后的参数,利用e s6的…运算符可以很方便处理函数调用需要的参数。拿到结果后,删除该属性,返回结果,简易版call就实现了.

  • apply和call类似,不过后续接受的是数组,利用…我们也可以很轻易实现apply方法,实现如下

    Function.prototype.myApply = function(self,args){
      self = self || globalThis
      self.fn = this
      let result = self.fn(...args)
      delete self.fn
      return result
    }
    

    为apply时第二个参数就是数组,函数调用时利用…运算符拆分即可

  • bind时是返回方法,对call方法稍加改造即可,实现如下

    Function.prototype.myBind = function(self,...args1) {
      self = self || globalThis
      self.fn = this
      return function(...args2) {
        return self.fn(...args1.concat(args2))
      }
    }
    

    为bind时注意没有delete,是因为可以多次调用新函数,比如

    const fn = (num) => {
      return num
    }
    
    console.log(bn(2))
    // 2
    console.log(bn(3))
    // 3
    

小结

  • 这只是简易的实现,并没有添加类型校验等等
  • 还是要多学多记,发现现在再学再看能很快的掌握~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值