什么是函数式编程?
函数式编程中的函数不是指程序中的函数(方法),而是数学中的函数即映射关系
相同的输入始终得到相同的输出
函数式编程用来描述数据之间的映射
例
function add(a,b){
return a + b;
}
let sum = add(2,3);
console.log(sum);
什么是高阶函数?
高阶函数:
1可以把函数作为参数传递给另一个函数
2可以把函数作为另一个函数的返回值
例:
let arr = [1, 3, 4, 7, 8];
Array.prototype.myForEach = function(fn) {
for (var i = 0; i < this.length; i++) {
fn(this[i], i, this);
}
}
arr.myForEach(function(item,index,names){
console.log(item,index,names)
})
例2
//创建一个新数组
let arr = [1, 3, 4, 7, 8];
Array.prototype.myfilter=function(fn){
let resut=[];
for (var i = 0; i < this.length; i++) {
if(fn(this[i])){
result.push(this[i])
}
}
return result;
}
arr.myfilter(function(item) {
return item % 2 === 0
})
列3
let arr = [1, 3, 4, 7, 8];
Array.prototype.mymap=function(fn){
const result=[];
for (var i = 0; i < this.length; i++) {
result.push(fn(this[i]))
}
return result
}
arr.mymap(function(item){
return item*2
})
2函数作为返回值
function once(fn){
let flag=false;
return function(){
if(!flag){
flag=true;
return fn.apply(this,arguments)
}
}
}
纯函数相同输入等到相同的输出,代表库lodash
柯里化(currying)
当一个函数有多个参数的时候传递一部分参数调用它
然后返回一个新的函数接收剩余的参数,返回结果
function curry(func){
return function curriedFn(...args){
if(args.length < func.length){
return function(){
return curriedFn(...args.concat(Array.from(arguments)));
}
}
return func(...args);
}
}
函数组合(函数组合从右到左)