引入:
將使用多個參數的函數轉換成一系列使用一個參數的函數的技術
主要用途是可以簡化代碼結構, 提高系統的可維護性, 一個方法, 只有一個參數, 強制地適應了單一性原則
例子:
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);
我們總結下柯里化的好處
降低代碼的重複性,提高利用率