實現函數的科里化-- 原理
傳入一個普通函數,函數依次傳入參數,當函數的形參個數 >= 函數的實參個數時調用函數, 函數的形參個數為fn.length;當函數的實參小於形參時返回新的函數並將實參傳遞給新的函數,直到實參 >= 形參。使用了閉包和遞歸。
function curry (fn) {
return function carried (...args) {
if (fn.length > args.length) {
return function () {
// 將之前的參數和新傳入的參數(即目前的所有參數)傳遞給新的函數,遞歸調用carried函數
return carried(...args.concat(Array.from(arguments)))
}
}
// 遞歸的出口
return fn(...args)
}
}
// 測試
// 要科里化的函數
function getSum (a, b, c) {
return a + b + c
}
let mycurried = curry(getSum)
console.log(mycurried(1)(2)(3))
console.log(mycurried(1,2)(3))
console.log(mycurried()(1,2)(3))
console.log(mycurried(1,2,3))