柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
举个例子:
function add(a, b) {
return a + b;
}
// 执行 add 函数,一次传入两个参数即可
add(1, 2) // 3
// 假设有一个 curry 函数可以做到柯里化
var addCurry = curry(add);
addCurry(1)(2) // 3
首先记住一句话 函数柯里化,其实就是把多次调用的变量保存在闭包中,每次调用都查看一下变量数和原函数的形参数量是否相等。不相等就继续递归。直到相等为止就处理了。
函数柯里化实现
function curry(fn,args){
var length = fn.length // 获得fn应有的形参数量
var arg = args || [] // 如果初始变量有传进去就用初始变量作为初始值,不然就是空数组,用于收集后续调用的变量
return function(){
var _arg = arg.slice(0) // 外面变量的副本
// 循环的是return 的这个funciton的传入实参的长度
for(var i =0 ;i<arguments.length;i++){
// 把变量全部传入这个存储总变量的副本中
_arg.push(arguments[i])
}
//如果小于说明还没达到理想的参数数量,继续柯里化等待下一轮参数
if(_arg.length<length){
return curry.call(this,fn,_arg) // 这个设置this是因为如果以后有对象进行调用的能指向对象的内部,不然就指向window了
}else{
return fn.apply(this._arg) // 执行原函数
}
}
}
高颜值方法:
const currying = (fn) => {
judge = (...args) => {
fn.length = args.length ?
fn(args) :
(arg) => judge(...args,arg)
}
}