背景
- 同样是作业,我也是第一次听到反柯里化函数,第一次听感觉就是个call,意思是调用对象的任何函数不用考虑它有没有这个函数,把函数和对象绑定后,对象即也能用这个函数。
思路
- 实现反柯里化函数肯定要给你需要的对象绑定函数,这个函数绑定到this上还需要再进行调用和传参,于是核心就是两个call或者this或者bind即可。
代码
Function.prototype.unCurrying = function () {
return (...args)=> Function.prototype.call.apply(this,args)
}
Function.prototype.unCurrying = function () {
return (...args)=>Function.prototype.call.call(this,...args)
}
Function.prototype.unCurrying = function () {
return (...args)=> Function.prototype.bind.call(this,...args)
}
const obj = {};
const push = Array.prototype.push.unCurrying();
push(obj, 'kkk')
push(obj, 'kkk')();
console.log(obj.length);
console.log(obj);
思考
- 这个实际上感觉和call没多少区别,特别的就是在Function上绑了个unCurring函数,然后使用别的对象方法可以沿着继承链去调用unCurring函数,这个时候的unCurring函数里的this就是想要使用的方法,再经过一个call把参数传进去。
- 这个本质别被误导了,并不是什么不用考虑一个东西有没有这方法,本质是2个call,相当于先把obj绑定到push上,再call一下往push里传字符串。相当于
Array.prototype.push.call(obj,'xxx')
,那么为什么要搞复杂?就是把这个什么都能用这个函数做的方法给抽离出来,让this等于想用的方法,进行调2次。 - 试着手动实现简易的call
Function.prototype.mycall=function (context,...args) {
let fn=Symbol();
context[fn]=this;
const res=context[fn](...args)
delete context[fn]
return res
}
bbb={value:2}
function aaa(ccc) {
console.log(this.value);
console.log(ccc);
}
aaa.mycall(bbb,'xxx');
- 可以发现,这个本质实际上是把函数绑到需要调用的对象的一个属性上,然后执行它。
- apply就把参数改一下即可。