手写 call()、apply()、bind() 函数

call()函数

// call 参数是一个一个传递
Function.prototype.myCall = function () {
  // 获取参数
  let args = [...arguments];

  // 取出传进来的第一个参数 this
  let obj = args.shift() || window;

  // 将当前的this变成obj的属性
  obj.fn = this;

  // 执行函数 这一步args中已经shift() 去除了第一个this
  const result = obj.fn(...args);

  // 删除fn
  delete obj.fn;

  // 返回结果
  return result;
};

apply()函数

// apply 参数是数组形式传递
Function.prototype.myApply = function () {
  // 获取参数
  let args = [...arguments];

  // 取出传进来的第一个参数 this
  let obj = args.shift() || window;

  // 将当前的this变成obj的属性
  obj.fn = this;

  // 执行函数 这一步args中已经shift() 去除了第一个this
  let result;
  // 不判断会报错 找不到
  if (args[0]) {
    result = obj.fn(...args[0]);
  } else {
    result = obj.fn();
  }

  // 删除fn
  delete obj.fn;

  // 返回结果
  return result;
};

bind()函数

// 手写apply函数 返回的是一个函数
Function.prototype.myBind = function () {
  // 获取所有参数,并拆解成为数组
  const args = Array.prototype.slice.call(arguments);

  // 获取数组第一项(就是传进来的this)
  const t = args.shift(); // 返回第一项 原数组剔除第一项

  // 当前的this
  const self = this;

  // 返回一个函数
  return function () {
    return self.apply(t, args);
  };
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值