4. 柯里化
<h4>不可或缺的 curry</h4>
<blockquote>
<p>curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。</p>
</blockquote>
<pre><code class="language-javascript">var add = function(x) {
return function(y) {
return x + y;
};
};
var increment = add(1);
var addTen = add(10);
increment(2);
// 3
addTen(2);
// 12</code></pre>
<p>这里我们定义了一个 add 函数,它接受一个参数并返回一个新的函数。调用 add 之后,返回的函数就通过闭包的方式记住了 add 的第一个参数。一次性地调用它实在是有点繁琐,好在我们可以使用一个特殊的 curry 帮助函数(helper function)使这类函数的定义和调用更加容易。</p>
<p>当我们谈论纯函数的时候,我们说它们接受一个输入返回一个输出。curry 函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。这就是一个输入对应一个输出啊。</p>
<h4>总结</h4>
<p>curry 函数用起来非常得心应手,每天使用它对我来说简直就是一种享受。它堪称手头必备工具,能够让函数式编程不那么繁琐和沉闷。</p>
<p>例子:
/**函数柯里化</p>
<ul>
<li>概念 - 调用另一个函数并为它,参数1:传入柯里化的函数 参数2:其他参数,要传入的值</li>
<li>功能 - 参数复用 延迟执行</li>
<li>案例:curry 创建柯里化的通用公式
*/</li>
</ul>
<pre><code class="language-javascript">function curry (fn) { // curry第一个参数=>柯里化函数 ,其他参数 => 要传入的值
var args = Array.prototype.slice.call(arguments, 1); //其他参数
return function (...innerArgs) {
console.log(innerArgs)
// var innerArgs = Array.prototype.slice.call(arguments); // =>返回内部函数的参数
var finalArgs = args.concat(innerArgs); //=> curry函数参数与返回函数的参数连接成数组
return fn.apply(null, finalArgs)
}
}
function add (x, y) {
return x + y
}
var result = curry(add, 1); // => 函数
var result1 = result(2);
console.log(result1) // => 3</code></pre>
<h5>第二种:比较完善的柯里化函数</h5>
<pre><code class="language-javascript">var curry = function (f) {
var len = f.length;
return function t () {
var innerLength = arguments.length,
args = Array.prototype.slice.call(arguments);
if (innerLength >= len) { // 递归出口,f.length
console.log(innerLength)
return f.apply(undefined, args)
} else {
return function () {
var innerArgs = Array.prototype.slice.call(arguments),
allArgs = args.concat(innerArgs);
return t.apply(undefined, allArgs);
}
}
}
}
// 测试一下
function add (num1, num2) {
return num1 + num2;
}
var curriedAdd = curry(add);
add(2)(3); //5
console.log(curriedAdd(2)(3))
</code></pre>