Skip to content

函数式编程基础

高阶函数

只要满足以下两个特点,那么我们就可以称之为高阶函数:

  • 函数可以作为参数被传递
  • 函数可以作为返回值输出

很明显, JavaScript 的函数就满足上面两个条件

  1. 函数可以作为参数被传递
js
function conlogFn() {
    console.log('test')
}
function test(fn) {
    fn()
}

test(conlogFn) // test
  1. 函数可以作为返回值输出
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

对于纯函数来说,副作用是很可怕的。但这不说明副作用就是一个炸弹,对于一个完整的程序来说,副作用却至关重要。