函数式编程
什么是函数式编程
函数式编程就是对运算过程的一种抽象
其他的编程方案
面向过程编程
const arr = [1,2,3,4,5,6]let sum = 0for(let i = 0;i<arr.length;i++){sum =+ arr[i]}console.log(sum)
面向对象编程
要维护对象和行为
class Calc{constructor(){this.sum = 0}add(arr){for (let i = 0; i < arr.length; i++) {this.sum += arr[i]}}}const arr = [1,2,3,4,5,6]const calc = new Calc()calc.add(arr)
函数式编程的优势
函数是一等公民
- 函数可以存储在变量中
let x = function(){}
- 函数可以作为参数
- 函数可以作为返回值
高阶函数
一个函数的入参是函数 ,或者 函数的返回值是函数
- 入参是函数
function(cb){}
- 返回值是函数
function fn2(){return function(){}}
实战
封装 reduce 高阶函数
Array.prototype.reduce=function(callback,startVal){// 如果传递了 let arr = this// 谁调用我指向谁// 基础值let acc = typeof startVal == "undefined"?arr[0]:startVal//没传 第 0 个,传了就用传的// 开始索引let sIndex = typeof startVal == "undefined"?1:0for(let i = sIndex;i<arr.length;i++){acc = callback(acc,arr[i])}return acc
}
切片编程
AOP 对我们已有的逻辑进行扩展,但不破坏原有的逻辑
function say(val){console.log(val)}Function.prototype.before=function(callback){return (...arg)=>{callback(...args)//先调用传入的函数,再调用自己的this(...args)}}say.before(()=>{//before是高阶函数console.log("beforeSay")})new say("我说了一句话")
函数缓存
点赞功能
点赞一次之后,重复点赞无效等
function memoize(fn, resolver) {const cache = new Map()return function (...args) {const key = typeof resolver === "function" ? resolver(...arg) : args[0]let result = cache.get(key)if (result == undefined) {result = fn(...args)cache.set(key, result)}return result}
}
纯函数
相同的输入永远得到相同的输出,并且没有任何副作用
非纯函数
let count = 0function counter(){count++//依赖外部状态,多次调用返回结果不同return count}
let date = new Date()function getTime(){// 不同时间的调用,返回值不同return date.toLocalTimeString()}
函数的副作用
- 对全局变量或者静态变量的修改
- 对外部资源的访问(如文件,数据库,网络http请求)
- 对系统状态的修改(环境变量)
- 对共享内存的修改
- Dom访问,打印/log等
ocalTimeString()
}
函数的副作用
- 对全局变量或者静态变量的修改
- 对外部资源的访问(如文件,数据库,网络http请求)
- 对系统状态的修改(环境变量)
- 对共享内存的修改
- Dom访问,打印/log等