如何模拟实现一个call、apply、bind函数

本文详细探讨了JavaScript中的call、apply、bind方法,它们用于改变函数内部this的指向。call和apply的区别在于参数传递方式,call接受单独参数,apply通过数组传递。bind则返回一个新函数,延迟执行。文中通过代码实例模拟实现了这三个方法,包括处理参数传递、this指向、函数返回值以及bind的特殊场景,如作为构造函数时的行为。
摘要由CSDN通过智能技术生成

call, apply, bind这三个方法都可以改变函数内部this指向。区别是call, apply是立即指向该函数,而bind是返回一个新的函数,用于下次调用。

其中,call和apply的区别是传递函数参数的方式不同,call是一个一个传入,例如call(this, arg1, arg2, arg3)这样。但是apply是通过一个数组传递,比如apply(this, [arg1, arg2, arg3])。

call模拟实现
首先我们实现绑定this功能。

// 比如我们有一个foo函数
function getName() {
  return this.name;
}

// 还有一个wechat对象
const wechat = { name: 'fedaily' };

// 我们希望实现
getName.call(wechat); // fedaily

以wechat和getName这个为例,这里的this即getName,context即wechat。
我们将getName赋值给wechat对象的fn熟悉,然后通过wechat对象调用,最后删除这个fn属性。(实际中我们肯定不能用fn这个名字,避免和对象原本重复,我们可以用Symbol实现)

然后我们绑定this的功能就实现。还有传递参数,这个也好办。

Function.prototype.call = function () {
  const [ctx, ...args] = arguments;
  ctx.fn = this;
  ctx.fn(...args);
  delete ctx.fn;
}
// 这里其实用了ES6的语法,但是主要为了更好的说明整个实现过程,理解原理就好
</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值