函数柯里化的好处有三个:
- 可以将函数作为参数传递 (用于参数复用)
- 可以将函数作为返回值输出 (提前返回)
- 函数的延迟计算 (使用较少)
缺点:
- 【通用函数】解决了兼容性问题,但同时也会再来,使用的不便利性,不同的应用场景往,要传递很多参数,以达到解决特定问题的目的。有时候应用中,同一种规则可能会反复使用,这就可能会造成代码的重复性。
总结:说白了柯里化就是用到了很多闭包,递归,参数展开,绑定调用对象来满足一个功能函数的适用性,让使用这个功能的函数更加强健,可以在开发中非常优雅的处理复杂逻辑。但是这个函数也由于柯里化更加局限了这能在这一功能复用,不能很好的被其他功能的函数复用。
参数复用
经典面试题
// 柯里化
var foo = function(x) {
return function(y) {
return x + y
}
}
foo(3)(4) // 7
// 参数复用
var func = foo(3);
func(5); // 8
func(6); // 9
// 普通方法
var add = function(x, y) {
return x + y;
}
add(3, 4) //7
更通用的柯里化函数
function curry(fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
function add(num1, num2) {
return num1 + num2;
}
var curriedAdd = curry(add, 5);
var curriedAdd2 = curry(add, 5, 12);
alert(curriedAdd(3)) // 8
alert(curriedAdd2()) // 17
提前返回函数
一般情况下两次判断才能返回
使用柯里化之后只需要一次判断即可,之后的操作交给返回的函数操作
更加精简的代码
延迟计算
很少用 =_=
最后介绍一下数组的高阶函数reduce()
Array的reduce()
把一个函数作用在这个Array
的[x1, x2, x3...]
上,这个函数必须接收两个参数,reduce()
把结果继续和序列的下一个元素做累积计算,其效果就是:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
比方说对一个Array
求和,就可以用reduce
实现:
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x + y;
}); // 25