柯里化函数
柯里化:
柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
核心思想是把多参数传入的函数拆成单参数(或部分)函数,内部再返回调用下一个单参数(或部分)函数,依次处理剩余的参数。
带有参数的柯里化函数
function Curry(fn){ //fn函数 需要传参数的长度 let len = fn.length; //获取到函数实参的值 let fnArr = [].slice.call(arguments,1); return function curryed(...args){ //拼接所有参数 let newArgs = [...fnArr,...args]; //所传参数是否齐全 if(newArgs.length >= len){ fn.apply(this,newArgs) }else{ return function(...arg){ return curryed.apply(this,[...arg,...args]) } } } } function add(a,b,c,d){ console.log(a+b+c+d) } var addCurry = new Curry(add,1) addCurry(2,3,4) //10 addCurry(2)(3)(4) //10
//另一种利用toString隐式特性
function Curry(){
let args = [...arguments]
function fn(){
args.push(...arguments)
return fn
}
fn.toString = function (){
return args.reduce((a,b) =>a + b)
}
return fn
}
不带参数的柯里化函数
function Curry(fn){ // 获取到参数值 let fnArr = [].slice.call(arguments,1); return function curryed(...args){ //没有传参数 if(!args.length){ return fn.apply(this,[...args,...fnArr]) } return function(...arg){ if(!arg.length){ return fn.apply(this,[...arg,...fnArr,...args]) } return curryed.apply(this,[...arg,...args]) } } } function add(){ var args = Array.from(arguments); return args.reduce((a,b) => a+b) } var curryAdd = new Curry(add,1,2,3,4) console.log(curryAdd()) // 10 console.log(curryAdd(5)) //15

浙公网安备 33010602011771号