js 函數式編程之柯里化

引入:

將使用多個參數的函數轉換成一系列使用一個參數的函數的技術
主要用途是可以簡化代碼結構, 提高系統的可維護性, 一個方法, 只有一個參數, 強制地適應了單一性原則

例子:

function add(a, b, c, d) {
            return a + b + c + d;
}
基本調用:
add(1,2,3,4)
在實現柯里化後:
var newadd = Curry(add);
newadd(1,2)(3)(4

固定參數的柯里化

function newFixedCurry(fn) {
            //  [arr,1,2];
            // fn是個類數組
            var arr = Array.prototype.slice.call(arguments, 1);

            return function () {
                var newArg = arr.concat([].slice.call(arguments, 0));
                return fn.apply(this, newArg);
            }
        }
        
var newAdd = newFixedCurry(add, 1, 2);
var ans = newAdd(2,4);  //這個一定要把剩下參數補齊

newFixedCurry的作用就是根據需求, 將參數拆分。實際這個函數做的事情很簡單, 將第一次傳遞的不完全的參數截取出來, 在閉包中保留。 返回一個新的函數, 這個新的函數再次調用的時候, 就會補齊參數, 然後將兩次傳遞進來的參數合併, 在將參數傳遞給功能函數(add
這就是柯里化的基本雛形!!!

真正的柯里化應該長這樣

var newadd = Curry(add);
newadd(1)(2)(3,4)
newadd(1)(2,3,4)
newadd(1,2,3)(4)

實現


function newFixedCurry(fn) {
            //  [arr,1,2];
            // fn是個類數組
            var arr = Array.prototype.slice.call(arguments, 1);

            return function () {
                //  arguments [2,3];
                var newArg = arr.concat([].slice.call(arguments, 0));
                return fn.apply(this, newArg);
            }
        }
function Curry(fn, length) {
            // length
            var length = length || fn.length;
            return function () {
                if (arguments.length < length) {
                    // 生成一個數組  第一個值是函數,接下來的就是arguments參數值
                    // [fn,argue]
                    var combined = [fn].concat([].slice.call(arguments, 0));
                    return Curry(newFixedCurry.apply(this, combined), length - arguments.length);

                } else {
                    return fn.apply(this, arguments);
                }
            }
        }

試一試:

	var newAdd = Curry(add);
        var x1 = newAdd(4,2);
        var x2 = x1(2,3);
        var x3 = x1(4,5);

結果

我們總結下柯里化的好處

降低代碼的重複性,提高利用率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章