先解釋下什麼是 柯里化html
在計算機科學中,柯里化(英語:Currying),又譯爲卡瑞化或加里化,是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。
js 裏也有柯里化的實現,只是平時沒有在乎。先把原文簡介貼出來,此文都來自於它,有興趣的可直接訪問:JavaScript 專題之函數柯里化前端
裏面有段方法,關於柯里化函數:git
// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896 var curry = fn => (judge = (...args) => args.length === fn.length ? fn(...args) : arg => judge(...args, arg));
設計 es6 的一些特性,或許一會兒很難理解,這裏稍微寫的再繁瑣下:es6
var curry = function(fn) { /** * judge * args: 柯里化函數的參數 */ return function judge() { var args = [].slice.call(arguments); // 柯里化定義的函數參數 == 調用該函數的參數 if (args.length >= fn.length) { return fn(...args); } else { // 經過 ()() 形式調用 -- 柯里化 return function() { var args2 = [].slice.call(arguments); // 拼接成新的參數,遞歸繼續judge return judge.apply(null, args.concat(args2)); }; } }; };
參數調用來調用去,都暈了,那到底有什麼用呢?github
好比:實現不一樣幅度的相加功能編程
var sum = function(increment, number) { return increment + number; }; // 雖然都是相同的相加邏輯,可能在函數命名、功能定義上會有不一樣(固然這裏只是硬性舉個例子)。 var addOne = sum; var addTen = sum; console.log(addOne(1, 5)); //6 console.log(addTen(10, 5)); //15
若是函數柯里化後:微信
var addOne = curry(sum)(1)(5); //6 var addTen = curry(sum)(10)(5); //15
雖然生搬硬套,不過現實業務也會有相似場景。這裏能體會到 curry 帶來的好處:app
再舉一個簡單的 Promise 實現舉個例子:函數式編程
function MyPromise(fn) { // currying this.resolveFn = function(callback) { return callback; } this.then = function(callback) { fn(this.resolveFn(callback)); } } new MyPromise(function(resolve, reject) { setTimeout(function() { resolve(true) }, 1000) }).then(function(data) { console.log(data); })
我只是知識點的「加工者」, 更多內容請查閱原文連接 , 同時感謝原做者的付出:
若是你以爲這篇文章對你有幫助, 請點個贊或者分享給更多的道友。 函數
也能夠掃碼關注個人 微信訂閱號 - [ 前端雨爸 ], 第一時間收到技術文章 , 工做之餘我會持續輸出
最後感謝閱讀, 大家的支持是我寫做的最大動力