已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
4、调用 c 之后,返回的结果与调用 fn 的返回值一致
5、fn 的参数依次为函数 a, b, c 的调用参数
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
6
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);6
function curryIt(fn) {
let sum = 0;
return function a(_a) {
if (a.index === fn.length) {
const arr = new Array(fn.length).fill(0);
arr[0] = _a;
return fn.apply(null, arr) + sum;
}
a.index = a.index || 1;
a.index++;
sum += _a;
return a;
}
} function curryIt(fn) {
return function a(ap){
return function b(bp){
return function c(cp){
return fn(ap,bp,cp);
}
}
}
}
function fun(a,b,c){ return a+b+c; }
var fun1=curryIt(fun); //返回的是a函数体
var fun2=fun1(1); //返回的是b函数体
var fun3=fun2(2); //返回的是c函数体
console.log(fun3(3)); //输出结果是1+2+3=6 //这样或许更容易理解一些,亲自运行一下,查看控制台的输出就更容易明白了