已知 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
function curryIt(fn) { return (a) => { return (b) => { return (c) => { return fn(a,b,c); } } } }
function curryIt(fn) { const result = a => b => c => fn.call(this,a,b,c) return result }
function curryIt(fn) { return (a) => { return (b) => { return (c) => a + b + c; } } } // 简写 function curryIt(fn) { return (a) => (b) => (c) => a + b + c; } }
// recursion 递归 call,接收非数组 apply,接收数组 // args通过push, length变大 function curryIt(fn){ let args = [] return function recursion(arg){ args.push(arg) if (args.length < fn.length) { return function (arg2){ return recursion.call(null,arg2); } } return fn.apply(null,args) } } function curryIt(fn) { let args = [] function a(arg){ // 1、 a 的 length 属性值为 1(即显式声明 a 接收一个参数) args.push(arg) return b; // 2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1 } function b(arg){ args.push(arg) return c; // 3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1 } function c(arg){ args.push(arg); return fn(...args); // 4、调用 c 之后,返回的结果与调用 fn 的返回值一致 // 5、fn 的参数依次为函数 a, b, c 的调用参数 ...args } return a; // 1、 返回一个函数 a; }