js 擴展 -- currying 柯里函數

柯里化

先解釋下什麼是 柯里化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

  • 定製化。原有共性的方法,被拆成符合不一樣場景的業務方法
  • 參數明確。因爲 curry 是根據固定參數約定的,因此經過()()形式固化了參數用意(好比第一個是累加數,第二個是被相加數)

再舉一個簡單的 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);
})

參考

我只是知識點的「加工者」, 更多內容請查閱原文連接 , 同時感謝原做者的付出:

關於我

若是你以爲這篇文章對你有幫助, 請點個或者分享給更多的道友。 函數

也能夠掃碼關注個人 微信訂閱號 - [ 前端雨爸 ], 第一時間收到技術文章 , 工做之餘我會持續輸出

bVbtL5R?w=258&h=258

最後感謝閱讀, 大家的支持是我寫做的最大動力

相關文章
相關標籤/搜索