简单实现call()/apply()

在实现之前,有必要弄清楚call()/apply()的定义:

call():

使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

apply() :

调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

相同点:指定this值(第一个参数)来执行一个函数,并且可以传参
不同点:call()是单独传参,apply()是以数组形式传参

通过上面两者的定义,我们知道传参的处理相对简单,难点在于如何指定this值。

接下来看一下this指向规格:this指向最终执行调用他的对象

eg: fn.call(content, ...args)

使用上面这个例子分析,在目标this值的函数(content)中,调用fn就可以让fn的this指向content。

上代码

Function.prototype.myCall = function (content, ...args) {
	//content.fn的方式调用this, 使得函数的this指向content
    content.fn = this;
    return content.fn(...args);
}

测试一下

var module = {
	x: 42,
	getSite: function(y, z) {
	console.log('this---', this);
		return `${this.x},${y},${z}`;
	}
};

var getSiteCopy = module.getSite;
console.log(getSiteCopy.myCall(module, 142, 21)); // 42,142,21

appy()跟call()的不同点在于,apply()是以数组传参。
所以只需要将以上代码稍作修改:

Function.prototype.myApply = function (content, args) {
    content.fn = this;
    return content.fn(...args);
}

测试一下

var module = {
  x: 42,
  getSite: function(y, z) {
 console.log('this---', this);
    return `${this.x},${y},${z}`;
  }
};

var getSiteCopy = module.getSite;
console.log(getSiteCopy.myApply(module, [142, 21])); // 42,142,21



ps:转载请注明出处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值