手撕函数柯里化

手撕函数柯里化

十月 12, 2020
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

// 计算两数之和
const carry = (f, o) => {
o = o || []
const _len = f.length;
return function () {
console.log(o)
const _o = [].concat(o.slice(), Array.from(arguments));
if(_o.length < _len) {
return carry.call(this, f, _o);
}
return f.apply(this, _o);
}
};

const sum = (a,b,c) => a+b+c
const newSum = carry(sum)

console.log(newSum(1)(2)(3))

总结

柯里化的核心就是:不断拆解新生curry工厂函数的形参,内部闭包缓存,最终比对初始函数的形参个数与缓存形参个数。相同就实现再次调用。

需要注意的点:

  • thisarguements只有在functional函数中存在,箭头函数是没有这个东西的;
  • arguements只是一个伪数组,只拥有数组的个别几个方法和属性,可以借助Array.from转换为真实数组;
  • 注意区分callapply的区别;
  • 理解闭包的特性