在阅读本篇文章之前,您应该首先了解call方法和apply方法的用法以及es6中的扩展运算符...
的使用。
1.call
当一个函数调用call方法时,call接收的的一个参数,将作为调用函数的this,调用函数本身的参数在call中从第二个形参开始,逐个接收。
call的用法不做详细介绍,下面是我的实现方法:
Function.prototype.myCall = function (thisValue, ...args) {
thisValue.fn = this;
let res = thisValue.fn(...args);
delete thisValue.fn;
return res
}
const obj = {
type: 'obj'
}
function getName() {
return this.type
}
console.log(getName());
console.log(getName.call(obj));
console.log(getName.myCall(obj));
在myCall中传入了一个obj,obj将作为getName中的this来执行getName中的代码。
首先,将调用函数getName
赋值给obj
的一个属性上,thisValue.fn = this;
,之后通过obj.fn(...args)
就实现了this指向
的改变,
然后将obj上添加的属性删除
,最后返回
函数执行结果。
2.apply
apply和call唯一的不同就是call就收原参数是逐个接收,apply是用数组接收。fn.call(obj,param1,param2..)
fn.apply(obj,[pram1,param2,..])
apply的实现和call极其类似,不多做解释:
Function.prototype.myApply = function (thisValue, args) {
thisValue.fn = this;
//判断第二个参数是否有值(长度不为0的数组)
let res = args && args.length ? thisValue.fn(...args) : thisValue.fn()
delete thisValue.fn;
return res
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。