0 函数式编程定义
- 定义:Functional Programming,FP;
- 对比:函数式编程:对运算过程进行抽象;面向对象:封装、继承和多态
//非函数式 let num1 = 1 let num2 = 2 let sum1 = num1 + num2 console.log(sum1) //函数式 function add (n1,n2){ return n1 + n2 } let sum = add(3,4) console.log(sum2) ```
- 函数式编程中的函数指的不是程序中的函数(方法),而是数学中的函数即映射关系:y=f(x);相同的输入始终要得到相同的输出.
- 前置知识
- 函数是一等公民
- 高阶函数
- 闭包
-
函数是一等公民
- 函数可以存储在变量中
let fn = function(){cosole.log('我是函数')}
- 函数作为参数
- 函数作为返回值
const BlogController = { index(posts){return Views.index(posts)}, show(posts){return Views.show(posts)}, create(posts){return Db.create(posts)}, update(posts,attrs){return Db.update(posts,attrs)}, destory(posts){return Db.destory(posts)}, } //优化:把函数赋值给另一个函数的方法 const BlogController = { index: Views.index, show: Views.show, create: Db.create, update: Db.update, destory: Db.destory, }
- 函数是一等公民是高阶函数、柯里化等的基础。
- 函数可以存储在变量中
-
高阶函数(heigh-order function)
- [可以把函数作为参数传递给另一个函数]
function filter(array, fn) { let result = [] for (let i = 0; i < array.length; i++) { if (fn(array[i])) { result.push(array[i]) } } return result } //测试 let arr = [1, 2, 3, 4, 5] let r = filter(arr, function (item) { return item % 2 === 0 }) console.log(r); //[ 2, 4 ]
- [可以把函数作为另一个函数的返回结果]
// 2. once 使得函数只执行一次 function once(fn) { let done = false return function () { if (!done) { done = true //arguments是数组,它将作为参数传给fn. return fn.apply(this, arguments) } } } //测试 let pay = once(function (money) { console.log('支付了:', money); }) pay(5) pay(5) pay(6) pay(6) //支付了: 5
- 使用高阶函数的意义
- 抽象可以帮我们屏蔽细节,只需关注与我们的目标
- 告诫函数是用来抽象通用问题
//面向过程
let array = [1,2,3,4]
for (let i = 0; i < array.length; i++){
cosole.log(arrray[i])
}
//高阶函数
let array = [1,2,3,4]
forEach(array,item => {
console.log(item)
})
let array = [1,2,3,4]
let r = filter(array,item => {
return item % 2 === 0
})
- 常用的高阶函数
- forEach
- map
- filter
- every
- some
- find/findindex
- reduce
- sort ...