文章博客

技术团队文档示例


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第一个参数=&gt;柯里化函数 ,其他参数 =&gt; 要传入的值 var args = Array.prototype.slice.call(arguments, 1); //其他参数 return function (...innerArgs) { console.log(innerArgs) // var innerArgs = Array.prototype.slice.call(arguments); // =&gt;返回内部函数的参数 var finalArgs = args.concat(innerArgs); //=&gt; curry函数参数与返回函数的参数连接成数组 return fn.apply(null, finalArgs) } } function add (x, y) { return x + y } var result = curry(add, 1); // =&gt; 函数 var result1 = result(2); console.log(result1) // =&gt; 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 &gt;= 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>

页面列表

ITEM_HTML