函数式编程基础
高阶函数
只要满足以下两个特点,那么我们就可以称之为高阶函数:
- 函数可以作为参数被传递
- 函数可以作为返回值输出
很明显, JavaScript 的函数就满足上面两个条件
- 函数可以作为参数被传递
js
function conlogFn() {
console.log('test')
}
function test(fn) {
fn()
}
test(conlogFn) // test
- 函数可以作为返回值输出
js
function conlogFn() {
console.log('test')
}
function test(fn) {
return fn
}
const test2 = test(conlogFn)
test2() // test
所以 JavaScript 中的函数就是高阶函数
常用的高阶函数
高阶函数在我们日常开发中几乎随处可见,例如 ES6 数组中的 map、filter 等。
js
const arr = [1, 2, 3, 4]
const newArr = arr.map((item) => {
return item + 1
}) // [2, 3, 4, 5]
上面就是我们像 map 函数中传入了一个箭头函数作为函数参数。
副作用
如果一个函数除了计算之外,还对它的执行上下文、执行宿主等外部环境造成了一些其它的影响,那么这些影响就是所谓的”副作用”。
例如:
js
let user = {
name: '张三'
}
function changeName(obj) {
obj.name = '李四'
return obj
}
changeName(user)
由于引用数据类型的原因。在函数内部改变 obj.name 时,也把最外层的 user.name 一起改变了。这就让函数 changeName 拥有了副作用。
纯函数
同时满足以下两个特征的函数,我们就认为是纯函数:
- 对于相同的输入( 函数的入参 ),总是会得到相同的输出
- 在执行过程中没有语义上可观察的副作用。
例如:
js
let a = 10
let b = 20
function add(num1, num2) {
return a + b
}
add(num1, num2)
纯函数是稳定、安全、一致并且可预测的。
给定相同的参数,纯函数将始终返回相同的结果。我们不需要考虑,相同的参数会产生不同的结果,因为它永远不会发生。
此外我们也不需要担忧,纯函数是否对外界进行了干扰,因为它永远不会影响到函数之外。
TIP
对于纯函数来说,副作用是很可怕的。但这不说明副作用就是一个炸弹,对于一个完整的程序来说,副作用却至关重要。