手写实现call、apply和bind函数

手写 call 函数

/**
 * 手写 call 函数
 * @param {*} context
 * @returns
 */
const myCall = function (context) {
  if (typeof this !== "function") return TypeError("not a function");
  const ctx = context || window;
  const args = [...arguments];
  args.splice(0, 1);
  ctx.fn = this;
  const ret = ctx.fn(...args);
  delete ctx.fn;
  return ret;
};

// test
const a = 789;
const obj = { a: 123, b: 456 };
const fn = function () {
  console.log(this.a);
};
fn.myCall = myCall;

fn.myCall(obj); // 123

手写 apply 函数

/**
 * 手写 apply 函数
 * @param {*} context
 * @returns
 */
const myApply = function (context) {
  if (typeof this !== "function") return TypeError("not a function");
  const ctx = context || window;
  const args = [...arguments]?.[1];
  ctx.fn = this;
  let ret = null;
  if (Array.isArray(args) && args.length > 0) {
    ret = ctx.fn(...args);
  } else {
    ret = ctx.fn();
  }
  delete ctx.fn;
  return ret;
};

// test
const a = 789;
const obj = { a: 123, b: 456 };
const fn = function () {
  console.log(this.a);
};
fn.myApply = myApply;

fn.myApply(obj); // 123

手写 bind 函数

/**
 * 手写 bind 函数
 * @param {*} context
 * @param  {...any} args1
 * @returns
 */
const myBind = function (context, ...args1) {
  if (typeof this !== "function") return TypeError("not a function");
  const ctx = context || window;
  ctx.fn = this;
  return function (...args2) {
    const args = [...args1, ...args2];
    const ret = ctx.fn(...args);
    delete ctx.fn;
    return ret;
  };
};

// 测试
function sum(num1, num2) {
  console.log(num1, num2, this);
}

sum.myBind = myBind;

// 原生的 bind() 方法
const Fn = sum.bind({ name: "bind" }, 1);
Fn(2);

// 自定义的 myBind() 方法
const Fn1 = sum.myBind({ name: "myBind" }, 1);
Fn1(2);

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值