编程笔记

柯里化

示例:实现 add(1)(2, 3)(4)(5)() = 10 的效果

  • 传入参数时,代码不执行输出结果,而是先记忆起来
  • 当传入空的参数时,代表可以进行真正的运算

使用ES5实现

使用闭包特性,接收到参数时 不调用方法,等所有参数凑齐,接收到空参数时,开始运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function currying(fn){
var allArgs=[];
return function next(){
var curArgs=Array.from(arguments);
if(curArgs.length===0){
return fn.apply(null,allArgs)
}else{
allArgs=allArgs.concat(curArgs);
return next;
}
}
}
function add(a,b,c,d,e){
return a+b+c+d+e;
}
let test=currying(add);
let res=test(1)(2,3,4)(5)();
console.log(res)
//输出结果15

ES6实现

利用es6展开运算符,展开参数并判断参数累计长度。 当累计的参数长度和原始方法参数的长度相等,则立刻执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function currying(fn) {
let next = (...args) => {
//展开运算符 如果当前方法收到的参数和原始方法参数长度相等,则立刻执行
if (args.length === fn.length) {
return fn(...args);
} else {
//否则继续展开参数 并返回next()函数
return (...arg) => next(...args, ...arg);
}
};
return next;
}
function add(a, b, c, d, e) {
return a + b + c + d + e;
}
let test = currying(add);
let res = test(1)(2, 3, 4)(5);
console.log(res);

偏函数