在数学和计算机科学之中,柯里化是一种将使用多个参数的一个函数转换成一些列使用一个参数的函数的技术。
前端为什么要用柯里化:
前端使用柯里化的用途主要是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。
柯里化的优点:
降低代码的重复率,提高代码的适应性。
调用形式:
function add(a, b, c) {};
var newAdd = Curry(add);
newAdd(1)(2)(3);
封装柯里化函数:
柯里化函数 function Curry(fn) {} 需要传入一个 固定参数的函数 作为参数
// 柯里化前奏
// 需要固定参数的函数
// fiexd params
function add(a, b, c, d) {
return a + b + c + d;
}
function FiexdParamsCurry(fn) {
// 把类数组arguments的第2~n位,剪切到数组_arg之中
var _arg = Array.prototype.slice.call(arguments, 1);
return function () {
// 把这个域的arguments和上个域的_arg拼接到newArg里面
var newArg = _arg.concat([].slice.call(arguments, 0));
return fn.apply(this, newArg);
}
}
var newAdd = FiexdParamsCurry(add, 1, 1);
console.log(newAdd(1, 1));
// 柯里化函数,必须传入一个固定参数的函数(fn)
// 柯里化函数的特性:期望实参能凑齐 ————> look forward to Params
function Curry(fn, length) {
// 记录fn所需要的实参个数
var length = length || fn.length;
return function () {
if (arguments.length < length) {
var combined = [fn].concat([].slice.call(arguments, 0));
return Curry(FiexdParamsCurry.apply(this, combined), length - arguments.length);
}else {
return fn.apply(this, arguments);
}
}
}
var curryAdd = Curry(add);