//函数柯里化 这个可以理解 // curry = fn => { // let arr = [];//保存之前输入的参数 // judge = (...args)=>{ // if(!args[args.length-1]){ // return fn(arr); // }else{ // arr.push(...args); // return judge;//返回一个表达式 调用才会执行 // } // // }; // return judge; // } //函数柯里化 curry = fn => judge = (...args)=>{ return !args[args.length-1]?fn(args):(...arg)=>judge(...args,...arg);//judge立即执行 调用自身 这不会死循环吗? }; testCurry = (args)=>{ args.pop();//去掉最后一个参数null if(args.length<1){ return; } let sum = args.reduce((s,n)=>{ return s+n; },0); console.log('参数',args); console.log('sum',sum); return sum; }; OnClick =()=>{ console.log('执行了这里 OnClick'); let one = this.curry(this.testCurry)(1); let two = one(2)(3)(4)(5); let three = two(6,6,6,6); three(null); };请问第二个函数怎么理解 她是怎么保存之前输入的参数的?求详细解答 谢谢
1 回答
慕少森
TA贡献2019条经验 获得超9个赞
judge并没有立即执行,而是在(...arg)=>judge(...args,...arg);方法被调用时才被执行
这个curry后的函数只有在传入的最后一个参数可以被转换为false的时候才开始执行,它存参数的方法也很简单
1,判断如果最后一个参数是否可以是false
2,是的话就把所有保存的参数放到fn里执行,结束
3,否则,返回一个新的匿名函数,这个函数把所有传入参数保存在arg数组中,而这个匿名函数被执行后,就把以前收到的参数数组和当前的参数数组合并后,放到前面说的逻辑中,在judge函数里判断,重复第1步
let curry = function(fn) {
var judge = function(...args) {
if (Boolean(args[args.length - 1])===false) {
return fn(args);//three(null)就到这里了
} else {
return function(...arg) { //one和two和three都是这个函数
return judge(...args, ...arg);
}
}
}
return judge;
}
添加回答
举报
0/150
提交
取消