手写call,apply,bind实现

call,apply,bind函数其本质是实现改变函数上下文环境,即改变this

call实现

    Function.prototype._call = function (context) {
      var context = context || window; 
      context._fn_ = this;
      var [_this, ...args] = arguments
      var result = context._fn_(...args)
      delete context._fn_;
      return result; //可能this函数会有返回值
    }
复制代码

apply实现

    Function.prototype._apply = function (context) {
      var context = context || window;
      context._fn_ = this;
      var [_this, args] = arguments //需要校验args为数组
      console.log('args :', args);
      var result = context._fn_(...args)
      delete context._fn_;
      return result;
    }
复制代码

bind实现

借助apply实现
    Function.prototype._bind = function (context, ...args) {
      return () => {
        this.apply((context || window), args)
      }
    }
复制代码
纯原生实现
    Function.prototype._bind2 = function (context=window, ...args) {
      context._fn_ = this
      return () => {
        context._fn_(...args);
      }
    }
复制代码

转载于:https://juejin.im/post/5d47b164f265da03f47c0604

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值