在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
一个函数例如
function add(a, b) {
return a + b;
}
// 执行 add 函数,一次传入两个参数即可
add(1, 2) // 3
// 假设有一个 curry 函数可以做到柯里化
var addCurry = curry(add);
addCurry(1)(2) // 3
简单实现一个给定一致的函数 例如上面的add
function add(x){
return function(y){
return x+y
}
}
// add(2)(3) =5
上面这种 太固定 过着太局限了
我们可以优化一下 可以实现 add(1,3,4)(5) 这种的
function add(...arg){
let temp=[].concat(arg)
let fn=function(...arg2){
temp=temp.concat(arg2)
return fn
}
fn.toString=function(){
console.log(temp)
let res=temp.reduce((x,y)=>x+y,0)
return res
}
return fn
}
console.log(String(add(1,3)(2)))
上面这种用到了 rest参数 以及 Array.reduce() 方法的使用
我们还可以写一个函数来处理 需要科里化的 函数
function trueCurrying(fn, ...args) {
if (args.length >= fn.length) {
return fn(...args)
}
return function (...args2) {
return trueCurrying(fn, ...args, ...args2)
}
}
let curAdd=trueCurrying(add)
curAdd(1)(3)(5)