【 函數柯里化 】

函數柯里化

  • 概念 - 調用另一個函數併爲它,參數1:傳入柯里化的函數 參數2:其他參數,要傳入的值
  • 功能 - 參數複用 延遲執行
  • 案例:curry 創建柯里化的通用公式
第一種:基本的柯里化函數
function curry (fn) { // curry第一個參數=>柯里化函數 ,其他參數 => 要傳入的值
    var args = Array.prototype.slice.call(arguments, 1);        //其他參數
    return function (...innerArgs) {
        console.log(innerArgs)
        // var innerArgs = Array.prototype.slice.call(arguments); // =>返回內部函數的參數
        var finalArgs = args.concat(innerArgs);               //=> curry函數參數與返回函數的參數連接成數組
        return fn.apply(null, finalArgs)
    }
}
function add (x, y) {
    return x + y
}
var result = curry(add, 1); // => 函數
var result1 = result(2);
console.log(result1)         // => 3
第二種:比較完善的柯里化函數
var curry = function (f) {
    var len = f.length;
    return function t () {
        var innerLength = arguments.length,
            args = Array.prototype.slice.call(arguments);
        if (innerLength >= 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))
//傳遞的參數和柯里化參數比較:如果小於柯里化參數,返回一個函數,需要再次傳遞參數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章