函数式编程
起源
历程:
命令式(脚本) => 面向对象式
命令式(脚本) => 函数式
解决代码复用的问题
原理特点
什么是函数式原理
加法结合律 | 因式分解 | 完全平方工时
水源 => 组合(水管 + 走线) => 花洒
理论思想
- 一等公民——函数 => 1.逻辑功能最终实现的落脚点 2.实现函数+拼接流程
- 声明式编程
- 惰性执行-衔接性,性能节约
实际开发
1.纯函数改造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const _class = { name: 'objective', }
const score = (str) => _class.name + ':' + str
const changeClass = (obj, name) => (obj.name = name)
const _class = { name: 'objective', }
const score = (obj, str) => obj.name + ':' + str const changeClass = (obj, name) => ({ ...obj, name })
changeClass(_class, 'functional') score(_class, 'good')
|
2.流水线组装-加工&组装
- 加工 - 科里化
1 2 3 4 5 6 7 8
| const add = x => y => z=> return x+y+z; add(1)(2)(3)
const fetch = ajax(method,url,params); const fetch = ajax.get(method); const request = fetch(url); 组合(fetch,request);
|
面试题
手写构造可拆分传参的累加函数
add(1)(2)(3)(4)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
const add = function (...nums) { let args = Array.prototype.slice.call(arguments) let inner = function (...nums) { args.push(...arguments) return inner } inner.toString = function () { return args.reduce((prev, cur) => { return prev + cur }) } return inner }
|
- 流水线 - 组装函数
1 2 3 4 5 6
| const compose = (f, g) => (x) => f(g(x))
const sum1 = (x) => x + 1 const sum2 = (x) => x + 2 const sum12 = compose(sum1, sum2) sum12(1)
|
常见的三方库
lodash
rxjs