偏函数与柯里化

这篇文章会深入讲解JavaScript中的偏函数和柯里化,这些知识在实际的业务开发中可能很少使用,但是如果想要深入了解框架实现原理或者阅读源码时候就要掌握这两个知识。偏函数和柯里化都是函数式编程的一种实现。

[1] 如果你在阅读中发现错误或者存在某些问题可以通过邮件的形式发送到作者的邮箱,再收到邮件后作者会及时处理这些问题。

[2] 阅读文章后你能了解到的有偏函数和柯里化是什么以及使用方式。


偏函数

简介

所谓偏函数是指通过固定的一个函数或者一些固定的参数返回一个用于接收不固定参数的函数。

例1:
1
2
3
4
5
6
7
8
9
function add(a, b) {
return a + b
}
console.log(add(1, 1)) // 2
console.log(add(1, 2)) // 3
console.log(add(1, 3)) // 4
console.log(add(1, 4)) // 5
console.log(add(1, 5)) // 6

通过上面的代码我们能够找到一个规律,add方法每次都传入了一个相同的参数,在参数比较多的情况下这种机械式的重复会十分繁琐。

例2:
1
2
3
4
5
6
7
8
9
function add(a, b, c, d, e) {
return a + b + c + d + e
}
console.log(add(1, 2, 3, 1, 2))
console.log(add(1, 2, 3, 2, 3))
console.log(add(1, 2, 3, 3, 4))
console.log(add(1, 2, 3, 4, 5))
console.log(add(1, 2, 3, 5, 6))

可以看到一旦我们有一个包装后的方法,它的前三个参数是固定参数,这样写就是机械式的重复,为此我们要用一种方法去解决这个问题。

例3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 入参函数
function add(a, b, c) {
return a + b + c
}
// 生产偏函数的工厂函数
function partial(fn, a, b) {
return function(c) {
return fn(a, b, c)
}
}
let parAdd = partial(add, 1, 2)
console.log(parAdd(1)) // 4
console.log(parAdd(2)) // 5
console.log(parAdd(3)) // 6
console.log(parAdd(4)) // 7
console.log(parAdd(5)) // 8

我们通过偏函数的形式,减少了每次传参量。

偏函数与bind联用
1
2
3
4
5
6
7
8
9
10
11
let obj = {}
function add(a, b, c){
return a + b + c
}
obj.parAdd = add.bind(obj, 1, 2)
console.log(obj.parAdd(1)) // 4
console.log(obj.parAdd(2)) // 5
console.log(obj.parAdd(3)) // 6

我们可以在封装函数时候对固定传入参数使用偏函数形式,减少传参量。

作用

减少重复的参数传递。


柯里化

简介

柯里化是将一元参数函数转换为多元参数函数,可以理解为fn(a, b)转换为fn(a)(b)。

例1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function add(a, b, c) {
return a + b + c
}
// 包装器函数
function curry(func) {
return function(a) {
return function(b) {
return function(c) {
return func(a, b, c)
}
}
}
}
let carriedSum = curry(add)
console.log(carriedSum(1)(2)(3)) // 6
console.log(carriedSum(2)(3)(4)) // 9
console.log(carriedSum(3)(4)(5)) // 12
作用

将传入参数拆分成最小单元,并且可以对每个单元进行任何操作。

------本文结束,感谢您的阅读,如有问题请通过邮件方式联系作者------