柯里化一般也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。
所以柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程。
我的理解为在函数传执行时函数并不计算结果,而是返回一个新的函数,这个新的函数已经内置了以前的参数,在须要计算结果时再返回结果。闭包
通用的柯里化函数app
var curry = function (fn) { //利用闭包来保存参数 var _args = []; return function () { //若是参数为0返回计算结果 if (arguments.length === 0) { return fn.apply(this, _args); } //不然将参数添加到_args中并返回当前函数 [].push.apply(_args, arguments); return arguments.callee; } };
柯里化一个求和函数函数
var add = curry(function () { return [].reduce.call(arguments, function (a, b) { return a + b; }) }); add(2, 4); add(4); add(2, 3, 45); //此时函数并未执行加法运算,只是保存了添加的参数 add(); //这里执行了加法运算,返回计算结果60