纯函数概念
-
相同的输入总是返回相同的输出,函数式编程依赖于纯函数
-
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 = 18 const 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 * r let getAreaWithMemory = _.memoize(getArea) console.log(getAreaWithMemory(4)) // 自己模拟memoize const memoize = f => { let cache = {} return function () { const key = JSON.stringify(arguments) cache[key] = cache[key] || f.apply(f, arguments) return cache[key] } }
网友评论