纯函数
- 什么是纯函数:相同的输入得到相同的输出,不依赖不影响外部环境也不产生副作用,输出完全取决于输入;
- 什么是副作用:只要跟函数外部环境发生了交互就是副作用。
- 纯函数有什么优势:可移植性,可测试,易维护。 4, 高阶函数左倾,高阶函数执行顺序是由右往左执行。
例子
let split = (str) => {
return str.split("")
};
let reverse= (str) => {
return str.reverse()
};
let join=(str)=>{
return str.join(",")
};
let toUpperCase=(str)=>{
return str.toUpperCase()
};
所有这些函数是单独抽取出来的,又相互调用的。所以需要用一个纯函数进行调用。
封装一个公用函数
function compose(){
var args=Array.from(arguments);
return function(x){
return args.reduce((prev,cur)=>{
return cur(prev)
},x)
}
}
const init=compose(split,reverse,join,toUpperCase);
console.log(init('肉蛋冲击'));
打印出来就是"击冲肉蛋"
函数结合律
函数组合中参数再进行组合函数结果不受影响。
const init1=compose(split,reverse,compose(join,toUpperCase));
console.log(init1('肉蛋冲击'));
打印出来就是"击冲肉蛋"
pointfree 风格的意思大致是只在乎参数不在乎数据怎么处理。类似这种组合函数就是这种风格。
自己写一个简单的缓存函数
//写一个缓存函数
function text(fn){
let ache={};
return function(x){
if(!ache[x]){
ache[x]='1'
return true;
}else{
return fn(x);
}
}
}
let someFn=(a)=>{
console.log(a+'Tokio Tomare');
}
const initFn=text(someFn);
initFn('砸哇鲁多')
initFn('砸哇鲁多')
第一个不会做出打印
第二个打印为 '砸哇鲁多Tokio Tomare'
拓展简单实现filter函数例子
function filters(fn){
if(!fn){
return
}
let arr=[];
return function(data){
data.forEach(element => {
console.log(fn(element))
if(fn(element)){
arr.push(element);
}
});
return arr;
}
}
// 实现filter 函数
let filterFn=filters(function(x){return x===2});
console.log(filterFn([1,2,3,4,2]));
打印出来[2,2]
这个列子属于是多此一举。用这种函数实现。