柯里化 https://cloud.tencent.com/developer/article/1851152 柯里化(currying)指的是将一个多参数的函数拆分成一系列函数,每个拆分后的函数都只接受一个参数(unary)。基本方法是使用一个闭包返回一个函数。

function add (a, b) { return a + b; } add(1, 1) // 2

上面代码中,函数add接受两个参数a和b。 柯里化就是将上面的函数拆分成两个函数,每个函数都只接受一个参数。

function add (a) { return function (b) { return a + b; } }

// 或者采用箭头函数写法 const add = x => y => x + y; const f = add(1); f(1) // 2 上面代码中,函数add只接受一个参数a,返回一个函数f。函数f也只接受一个参数b。

柯里化的应用 柯里化有 3 个常见应用:

参数复用 – 当在多次调用同一个函数,并且传递的参数绝大多数是相同的,那么该函数可能是一个很好的柯里化候选 提前返回 – 多次调用多次内部判断,可以直接把第一次判断的结果返回外部接收 延迟计算/运行 – 避免重复的去执行程序,等真正需要结果的时候再执行

经典面试题 add(1)(2)(3) = 6; add(1, 2, 3)(4) = 10; add(1)(2)(3)(4)(5) = 15;

function add() { // 将传入的不定参数转为数组对象 let args = Array.prototype.slice.call(arguments);

// 递归:内部函数里面进行自己调用自己 // 当 add 函数不断调用时,把第 N+1 个括号的参数加入到第 N 个括号的参数里面 let inner = function() { args.push(...arguments); return inner; }

inner.toString = function() { // args 里的值不断累加 return args.reduce(function(prev, cur) { return prev + cur;
}); };

return inner; }

// 测试一下 let result = add(1)(2)(3)(4); console.log(result);

上述封装因为立即执行函数的原因,触发多次事件也依旧只会触发一次 if 条件判断。

这里使用了函数柯里化的两个特点:提前返回和延迟执行。

这个例子写的很棒!!

https://cloud.tencent.com/developer/article/1851152

上次更新:
贡献者: 郑壮