一、JavaScript纯函数
定义:(维基百科) 符合以下条件的函数,被称为纯函数
- 此函数在相同的输入值时,需产生相同的输出。
- 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。
- 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。
简单的来说:
- 确定的输入,一定会产生确定的输出。
- 函数在执行过程中,不能产生副作用。
1.1、副作用
定义:表示在执行一个函数时,除了返回函数值之外,还对调用函数产生 了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储。
1.2、纯函数案列
function foo(n1, n2) {
return n1 + n2
}
这就是个纯函数,为什么呢? 1. 有确定的输入(n1和n2) 也有确定的输出 2. 他没有修改任何东西。
var arr = ['a', 'b', 'c', 'd', 'e']
var arr1 = arr.splice(0,2)
console.log(arr1); // [a, b]
console.log(arr); // ['c', 'd', 'e']
那我们来看看splice是个纯函数吗? 明显不是。为什么呢?虽然他有确定的输入和确定的输出。但是他修改了arr这个数组,所以他不是。
var a = 1
function foo() {
a = 2
}
这个也不是,他修改了a
var obj = { age: 18 }
function foo(n1) {
n1.age = 20
}
foo(obj)
console.log(obj); // { age: 20 }
这个也不是,因为他修改了我们传入的参数
var obj = { age: 18 }
function foo(n1) {
return {
...obj,
age: 20
}
}
foo(obj)
console.log(obj); // { age: 18 }
这个就是纯函数了 因为不论你调多少次foo(obj),他的输出都是一样的,obj这个对象是没被改变的。
二、JavaScript柯里化
定义:(维基百科)
- 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化。
- 是把接收多个参数的函数,变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术。
- 柯里化声称 “如果你固定某些参数,你将得到接受余下参数的一个函数”。
比如这样
function foo(n1, n2, n3, n4) {}
foo(1, 2, 3, 4)
// 柯里化
function bar(n1) {
return function(n2) {
return function(n3) {
return function(n4) {
console.log(n1 + n2 + n3 + n4);
}
}
}
}
bar(1)(2)(3)(4)
我们把foo写成了bar的这种形式,这就是函数的柯里化
那么这有什么好处吗? 虽然bar的这种效率不如foo这种写法,但是他可以只传一部分的参数就可以调用bar了 如bar(1),他不需要传完所有的参数。
我们可以得出只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数的过程就是柯里化
2.2、柯里化的作用
- 让函数的职责单一
函数式编程中,我们希望一个函数处理的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理,所以我们就可以将每次传入的参数在单一的函数中进行处理处理完后在下一个函数中再使用处理后的结果
function bar(n1) {
n1 += 2
return function(n2) {
n2 += 2
return function(n3) {
n3 += 2
return n1 + n2 + n3
}
}
}
console.log(bar(1)(2)(3));
类型与这样 我们每一个函数都只处理他里面的内容。
- 逻辑的复用 因为我们不同的函数在出处理不同的逻辑,所以他的复用性就会很好
function foo(n1) {
return function(n2) {
return n1 + n2
}
}
var add3 = foo(3)
add3(1) // 3 + 1
add3(2) // 3 + 2
add3(3) // 3 + 3