纯函数概念
相同的输入总是返回相同的输出,函数式编程依赖于纯函数
lodash
:纯函数功能库const _ = require('lodash')const array = ['jack', 'tom', 'lucy', 'kate']console.log(_.first(array))console.log(_.last(array))console.log(_.toUpper(_.first(array)))console.log(_.reverse(array))const r = _.each(array, (item, index) => { console.log(item, index)})
数组
slice
和splice
分别是纯函数和不纯的函数let number = [1, 2, 4, 4]number.slice(0, 2) // [1, 2]number.slice(0, 2) // [1, 2]number.slice(0, 2) // [1, 2]number.splice(0, 2) // [1, 2]number.splice(0, 2) // [4, 4]number.splice(0, 2) // []
纯函数意义
纯函数不依赖外部环境,不会产生反作用,提高函数的复用性
反作用:程序执行中,系统状态的一种变化,或者者与外部世界进行的可观察的交互(跟函数外部环境发生的交互都是反作用)
反作用让函数变得不纯,函数依赖于外部状态就无法保证输出相同,就会带来反作用
所有的外部交互都有可能带来反作用,反作用使得方法通用性下降,不适合扩展和复用性,同时反作用会给程序带来安全隐患和不确定性;所以反作用要尽可能控制
常见的反作用:
- 更改文件系统
- 配置文件
- 往数据库插入记录
- 发送一个
http
请求 - 可变数据
- 打印/log
- 获取客户输入
- DOM查询
- 访问系统状态
// 不纯的const MinimumAge = 18const checkAge = age => age >= mini// 纯函数const checkAge = age => { const MinimumAge = 18 return age >= MinimumAge}
可读性更强
可测试 纯函数测试更方便
test('checkAge(20) 等于 true', () => { expect(checkAge(20)).toBe(true);})
可以组装成复杂函数
可缓存(相同输入总是返回相同结果)
const _ = require('lodash')const getArea = r => Math.PI * r * rlet getAreaWithMemory = _.memoize(getArea)console.log(getAreaWithMemory(4))// 自己模拟memoizeconst memoize = f => { let cache = {} return function () { const key = JSON.stringify(arguments) cache[key] = cache[key] || f.apply(f, arguments) return cache[key] }}