函数式编程
函数的特点
- 函数是"一等公民"
- 纯函数/无副作用
- 高阶函数跟闭包
总的来说函数式编程就是对运算的过程抽象
函数式编程中的函数指的数学中的函数即映射关系,输入的值对应一个输出的值,例如 y = f(x)
相同的输入始终得到相同的输出(纯函数)
函数式编程用来描述数据(函数)之间的映射
优势
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
函数——头部函数
- 函数可以存储在变量中
- 函数作为参数
- 函数可以作为返回值
函数作为一个普通的对象,可以赋值于变量也能当作返回值
const fn = function () { console.log('this is a function') }
作为返回值
const BlogController = {
index(posts) {
return Views.index(posts)
},
show(post) {
return Views.show(post)
},
create(attrs) {
return Db.create(attrs)
},
update(post, attrs) {
return Db.update(post, attrs)
},
destroy(post) {
return Db.destroy(post)
}
}
纯函数
纯函数: 对于相同的输入永远会得到相同的输出,而且没有任何可观察的副作用
// 不纯的函数
const mini = 18
function checkAge(age) {
return age >= mini
}
// 纯函数
function checkAge(age) {
const mini = 18
return age >= mini
}
但是对于纯函数来说,不用直接修改函数外的代码,这样来说更加方便维护
闭包
闭包:函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。
其实就是内部的函数在堆上依然可以引用外部,可以联想一下离散数学闭包的概念。闭包是R+是包括R的
柯里化(Haskell Brooks Curry)
就是把多个参数先传一部分然后再返回新的函数来接受剩余的参数,和函数式编程的概念密切相关。 这种其实是一种函数闭包
// 普通纯函数
function checkAge(min, age) {
return age >= min
}
// 柯里化,函数闭包
function checkAge(min) {
return function (age) {
return age >= min
}
}
柯里化相当于把一些参数固定逐渐缩小变量个数,是一种对参数的暂时的保存,可以让函数粒度更小
组合函数
组合函数就是将函数变成参数组合