函数式编程(Functional Programming)
怎样的算是函数式编程?先来一段代码看看:
function splat(fn) {
return function(array) {
return fn.apply(null, array)
}
}
let sum = splat(function(x, y){ return x + y})
sum([1,2]) // => 3
函数式编程(概念):
- 是一种编程模式
- 最重要的性质:函数是一等公民
- 强调将计算过程分解成–>可以复用的函数
- 合格函数:纯函数
廖雪峰在Python的函数式编程中解释到:
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
编程模式走向
面向过程编程---->面向对象编程----->函数式编程
为什么要用函数式编程?
- js的不安全性:命令式语言和对全局作用域的依赖使得JavaScript存在不安全性
- 程序混乱:在创建程序时,将关键点放在处理易变性上,会给程序扩展带来潜在的混乱
- 函数式编程–>通过规范和规约–>控制确定性变量的输入和输出,分区分块成局部作用域。
高阶函数(Higher-order function)
【函数式编程的基本元素(函数是一等公民)】
概念: 可以把函数
作为入参,可以把函数
作为返回值的函数
函数做入参:模拟filter,forEach,map,every,some
// 模拟filter函数
function filter(array,fn){
let newArr = []
for(let i=0;i<array.length;i++){
if(fn(array[i])){
newArr.push(array[i])
}
}
return newArr
}
let list = [1,3,5,7]
let newList = filter(list,function(item){
return item>3
})
console.log(newList) // [5,7]
// forEach,map,every,some 同理,可以自己尝试一下
函数做返回值:模拟once
function once(fn){
let done = false
return function(){
if(!done){
done = true
fn.apply(this,arguments)
// console.log(this)
// console.log(arguments)
}
}
}
let doThing = once(something=>{
console.log('to '+ something)
})
doThing('eating')
意义:
- 抽象过程,屏蔽细节,业务代码只需关注对象,更灵活
- 用于抽象通用问题,代码更精简