柯里化函数的概念

  1. 什么是柯里化函数?

​ 柯里化是把接收多个参数的函数变成接受一个单一参数,返回接受余下的参数且返回结果的新函数。

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
function add(x, y) {
return x + y
}

function curryingadd(x) {
return function(y) {
return x + y
}
}

add(1, 2) // return 3
curryingadd(1)(2) // return 3
  1. 为什么要使用柯里化函数 参数复用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function peach(name, time, event) {
console.log(`我${name}${time}与两位兄弟${event}`)
}
peach('刘备', '今日', '桃园结义') // 我刘备于今日与两位兄弟桃园结义
peach('关羽', '今日', '桃园结义') // 我关羽于今日与两位兄弟桃园结义
peach('张飞', '今日', '桃园结义') // 我张飞于今日与两位兄弟桃园结义

function sworn(time) {
return function(event) {
return function(name) {
console.log(`我${name}${time}与两位兄弟${event}`)
}
}
}

let Info = sworn('今日')('桃园结义')
Info('刘备') // 我刘备于今日与两位兄弟桃园结义
Info('关羽') // 我关羽于今日与两位兄弟桃园结义
Info('张飞') // 我张飞于今日与两位兄弟桃园结义
  1. 实现一个add方法,使结算结果满足预期结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// add(1)(2)(3) == 6;
// add(1, 2, 3)(4) == 10;
// add(1)(2)(3)(4)(5) == 15;

function add() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = Array.prototype.slice.call(arguments);

// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function() {
_args.push(...arguments);
return _adder;
};

// 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function() {
return _args.reduce(function(a, b) {
return a + b;
});
}
return _adder;
}
console.log(add(1)(2)(3)) //6
console.log(add(1, 2, 3)(4)) //10
console.log(add(1)(2)(3)(4)(5)) //15