柯里化是 函数式编程 中的一个思想。
分析curry函数:
curry返回的是一个函数fn;- 执行
fn,中间状态返回的是函数,如:add(1) / add(1)(2); - 最后返回执行结果,如:
add(1)(2)(3)。
function currying(fn, ...args) {const len = fn.length; // Function.length 属性指明函数的形参个数let allArgs = [...args]const res = (...newArgs) => {allArgs = [...allArgs, ...newArgs]if (allArgs.length === len) {// console.log('最后执行吗?')return fn(...allArgs)} else {// console.log('啥时执行?')return res}}return res}var add = (a, b, c) => a + b + c;var a = currying(add, 1)a(2)(3) // 或 a(2, 3),保证形参和 add 函数所需形参个数相同
function curry(...fn) {const fnLen = fn.length; // 传入函数的参数长度,也就是 add 函数的参数长度:3const cacheArgs = []; // 收集参数// 返回的函数function calc(...args) {// 积累参数cacheArgs = [...cacheArgs, ...args];// 判断参数长度if (cacheArgs.length < fnLen) {// 若参数长度不够 add 函数所需参数长度,则返回函数return calc;} else {// 若参数长度够了,返回计算结果return fn.apply(this, cacheArgs.slice(0, fnLen)); // slice 避免传入超长参数,超长参数无用}}return calc;}var add = (a, b, c) => a + b + c;var a = currying(add)a(1)(2)(3) // 或 a(1, 2, 3),保证形参和 add 函数所需形参个数相同
