js 函数柯里化
函数柯里化(function currying),用于创建已经设置好了一个或者多个参数的函数。函数柯里化的基本方法与函数绑定是一样的:使用一个闭包返回一个函数,两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。
示例:
functionadd(num1, num2){returnnum1 num2;
}functioncurriedAdd(num2){returnadd(5, num2);
}console.log(add(2,3));// 5console.log(curriedAdd(3));// 8
这段代码定义了两个函数:add() 和 curriedAdd(),后者本质上是任何情况下第一参数为5 的add() 版本,尽管技术上来说curriedAdd() 并非柯里华的函数,但它更好的展示了其概念。
柯里化函数通常由以下步骤动态创建:调用另一个函数并为他传入要柯里华的函数和必要参数。
functioncurry(fn){letargs =Array.prototype.slice.call(arguments,1);// 外部所有参数returnfunction(){letinnerArgs =Array.prototype.slice.call(arguments),// 内部所有传入的的参数finalArgs = args.concat(innerArgs);// 合并内部外部参数returnfn.apply(null, finalArgs);// 传递给fn}
}functionadd(num1, num2){returnnum1 num2;
}constcurriedAdd = curry(add,5);console.log(curriedAdd(3))// 8constcurriedAdd1 = curry(add,5,12);console.log(curriedAdd1())// 17
接受多个参数
functiontoCurry(fn){//保存回调函数returnfunctioncurry(){varargs =Array.prototype.slice.call(arguments);//判断目前入参是否达到函数要求入参if(args.length < fn.length) {returnfunction(){//递归调用curry,拼接当前arguments和下次入参的argumentsreturncurry.apply(null, args.concat(Array.prototype.slice.call(arguments)))
}
}else{//执行函数returnfn.apply(null, args)
}
}
}functionadd(a, b, c){returna b c
}varfn = toCurry(add);console.log(fn(1,2)(3));//6console.log(fn(1)(2)(3));//6