深入理解函数式编程之柯里化
目錄
柯里化定義
柯里化原因
柯里化前奏——需要固定數量參數
實現柯里化——期待固定數量參數
應用柯里化
流程剖析
柯里化定義
在數學和計算機科學中,柯里化是一種將使用多個參數的一個函數轉化成一系列使用一個參數得函數的技術
In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments(or a tuple of arguments)into evaluating a sequence of functions,each with a single argument
柯里化原因
前端使用柯里化的用途主要就應該是簡化代碼結構,提高系統的維護性,一個方法只有一個參數,強制了功能的單一性,很自然就做到了功能內聚,降低耦合。
柯里化的優點就是降低代碼的重復,提高代碼的適應性
調用形式
function add(a, b, c) {}; var newAdd = Curry(add); newAdd(1)(2)(3)柯里化前奏——需要固定數量參數
【例】
function add(a, b, c, d) {return a + b + c + d; } function FixedParmasCurry(fn) {var _arg = [].slice.call(arguments, 1);return function () {var newArg = _arg.concat([].slice.call(arguments, 0));return fn.apply(this, newArg);} } var newAdd = FixedParmasCurry(add, 1); console.log(newAdd(2, 3, 4));【結果】打印10
【分析】
第5行的arguments是第11行的實參[add,1],該行表示將arguments的第1位,即'1'添加給數組_arg;
第11行相當于
newAdd = function () {var newArg = _arg.concat([].slice.call(arguments, 0));return add.apply(this, newArg); }故其arguments是第12行的實參[2,3,4];第7行表示將數組_arg和arguments,即[2,3,4]拼接起來賦值給數組newArg。
【注】柯里化的傳參方式(比較飄逸)
var newAdd = Curry(add); newAdd(1, 2, 3, 4); newAdd(1)(2, 3)(4); newAdd(1, 2)(3, 4); newAdd(1, 2)(3)(4); newAdd(1)(2)(3)(4);即只要滿足固定參數即可;若傳參不夠的話打印NaN;若傳參超出固定參數則忽略超出部分。
實現柯里化——期待固定數量參數
function add(a, b, c, d) {return a + b + c + d; } function FixedParmasCurry(fn) {var _arg = [].slice.call(arguments, 1);return function () {var newArg = _arg.concat([].slice.call(arguments, 0));return fn.apply(this, newArg);} } function Curry(fn, length) {//console.log(length);var length = length || fn.length;//console.log(length); return function () {if (arguments.length < length) {var combined = [fn].concat([].slice.call(arguments, 0));return Curry(FixedParmasCurry.apply(this, combined),length - arguments.length)} else {return fn.apply(this, arguments);}} } var newAdd = Curry(add); var num = newAdd(1)(2)(3)(4);【結果】打印10
【問題】第11行的形參length的作用是什么
【解決】26行調用Curry時沒有給length傳參,因此12行打印undefined,在第13行中length =fn.length,即4,然后在第18行遞歸的過程中,形參length一直減小,arguments.length增大,直到傳參的時候length減到0,再經過第13行使得length =fn.length= 4 = arguments.length,此時根據第16行判斷跳出遞歸。
【問題】遞歸(未解決,再說吧,懵逼了)
應用柯里化
【例】
function ajax(method, url, data) {console.log(method, url, data); } var ajaxCurry = Curry(ajax); var postAjax = ajaxCurry('post'); postAjax('www.test1.com',' name = jwh'); postAjax('www.test2.com', 'name = dqs');【結果】
【例】
function ajax(method, url, data) {console.log(method, url, data); } var ajaxCurry = Curry(ajax); var postAjax = ajaxCurry('post'); var getAjax = ajaxCurry('get'); postAjax('www.test1.com',' name = jwh'); getAjax('www.test2.com', 'name = dqs');【結果】
流程剖析
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的深入理解函数式编程之柯里化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6函数第一篇:参数篇
- 下一篇: ES6函数第二篇:剩余参数与展开运算符的