函数柯里化
将使用多个参数的函数转换成一系列使用一个参数的函数的技术
超简洁的函数柯里化写法
function curry(fn){
let judge=(...args)=>{
if(args.length===fn.length){
return fn(...args)
}else{
return (...arg)=>judge(...args,...arg);
}
}
return judge;
}
另一种函数柯里化写法
这种写法比上一种要复杂,它利用闭包中的一个数组不断收集参数,在参数收集完成之前一直返回函数,当最后参数终于收集完成时,就调用函数。
function curry(fn, arity, args) {
// 闭包
// arity用来记录fn函数的剩余的参数个数,第一次执行时不会传入arity
var arity = arity || fn.length;
// args用来收集参数,第一次执行时不会传入args,所以默认为空数组
var args = args || [];
return function () {
// 将传入的参数转为数组
var _args = [].slice.call(arguments);
// _args合并到args中(args是闭包中的变量,所以会一直存在,不断接收新的参数)
[].push.apply(args, _args);
// 如果新传入的参数个数小于剩余的参数个数,说明还没传满参数
if (_args.length < arity) {
// 因为新传进来了参数,剩余的参数个数减少
arity = arity - _args.length;
// 参数还没传满,返回出来一个新的函数
return curry(fn, arity, args);
}
// 新传入的参数个数等于或大于剩余的参数个数,说明参数已经传满,此时执行fn函数,并将所有的参数一次性给他
return fn.apply(this, args);
}
}