實現效果
const curry_fn = curry(fn);
fn(1, 2, 3) == curry_fn(1)(2)(3);
實現思路
- 經過閉包的方式儲存傳入參數
- 經過函數的length屬性得到參數個數
- 當參數個數不夠時直接返回方法
- 存儲的參數個數等於原函數參數個數時執行原函數
- 若是使用ES6參數默認值,length將不等於實際參數個數
- 參數由arguments獲取,ES6直接使用rest參數實現
源碼實現
function curry(fn) {
var length = fn.length; //獲取原函數的參數個數
var args = []; // args存儲傳入參數
return function curryFn() {
// 將arguments轉換成數組
var curryArgs = Array.prototype.slice.call(arguments);
args = args.concat(curryArgs);
if (args.length > length) {
throw new Error('arguments length error')
}
// 存儲的參數個數等於原函數參數個數時執行原函數
if (args.length === length) {
return fn.apply(null, args);
}
// 不然繼續返回函數
return curryFn;
};
}
ES6版
function curry(fn) {
let length = fn.length;
let args = [];
return function curryFn(...curryArgs) {
args = args.concat(curryArgs);
if (args.length > length) {
throw new Error('arguments length error')
}
if (args.length === length) {
return fn(...args);
}
return curryFn;
}
}