一、概念
函数式编程通过使用函数,来将值转换成抽象单元,接着用于构建软件系统。
命令式编程和函数式编程的区别?
命令式编程往往是建立在直接操作和检查程序状态之上的。
函数式,倾向于把程序拆分,并抽象成多个函数组装回去。
1、高阶函数
- 函数可以作为返回值(给了一些函数组合,编排,缓存的能力)
- 函数可以作为参数传递(给了一些函数,包装的能力)
优点:
- 表达力更清晰
- 利于复用
- 利于维护
2、纯函数 - 一个函数如果输入参数确定,那么输出的结果一定是唯一的。
- 无状态的
- 无副作用的
举例
//这是有副作用的
const minusCount = (num) => {
return window.count - num;
}
//要将有副作用的抽出来
const xxx =()=>{ return window}
//这样这个函数才是纯函数
const minusCount = (global,num) => {
return global.count - num;
}
3、柯里化
是把接受多个参数的函数变换成接受一个单一的参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
const minusCount = (global, num) => {
return global.count - num;
}
const minusCount = (global) => {
return function(num){
return global.count - num;
}
}
minusCount(global,num);
minusCount(global)(num)
二、实例
1、返回值为函数
假如我们有一个计算密集型函数,我们需要对这个函数进行包装,如果让这个函数。之前计算过就不再计算,直接返回值。
const memorize = fn => {
let cacheMap = {};
return function(...args){
const cacheKey = args.join('_');
if(cacheKey in cacheMap){
return cacheMap[cachekey];
} else{
return cacheMap[cacheKey] = fn.apply(this||{},args)
}
}
}
function add(a,b){
return a+b;
}
const madd = memorize(add);
madd(1,2);
madd(1,2);
madd(1,2);
2、参数和返回值都是函数
在执行任务前先执行bf1,改造成执行一个任务前可接受多个任务执行,且前一个任务执行的结果为后一个任务的输入参数。
这样柯里化后的函数式编程会提取公用逻辑,实现逻辑复用。
const warppedBefore = function(fn){
return fucntion(...args){
bf1();
return fn.apply(this,args);
}
}
const compose = (...rest) => {
return (startNum) => {
return rest.reduce((total,item) => {
return item(total)
},startNum)
}
}
const warppedBeforeList = (...bf) => function(fn){
return function(args) {
const c = compose(...br)(args);
return fn.call(this,c)
}
}
const fn_new = warppedBeforeList(bf1,bf2,bf3)(fn);
fn_new()