高阶函数
以函数作为参数/以函数作为返回值/常用于作为函数装饰器
常用高阶函数:防抖Debounce和节流Throttlejs手写题——防抖和节流 Promise、setTimeout等等
为什么要使用高阶函数?减少非纯函数的数量,增加系统稳定性与可靠性,纯函数方便做单元测试。
函数柯里化
函数式编程思想,既能减少代码冗余,也能增加可读性。它利用高阶函数,通过函数调用继续返回函数的形式,将接收多个参数转换为多次接收参数最后统一处理。既然能多次接收,说明上一个函数的执行结果(返回)也是一个函数,这样才能接收参数。
柯里化的一个典型的应用场景就是 bind 函数的实现。
对function中length属性的理解
const curry=function(fn,...args){
if([...args].length==fn.length){//fn.length表示函数的形参个数,arguments.length代表传入实参个数。相等即一下子传入所有参数的情况:sum(1,2,3,4)
return fn(...args);//直接调用函数
}else{
return function(...params){//下一个括号里的参数:比如把sum(1)(2)(3)(4)里的2拼进去
return curry(fn,...args,...params);//如果还不等于4的长度,继续递归调用
}
}
}
const sum=function(a,b,c,d){
console.log(a+b+c+d);
}
//sum(a,b,c,d);
//有个curry函数对sum做了个处理,curry(sum),使得处理后的sum可以这样传参:
//curry(sum)(a)(b)(c)(d) curry(sum)(a,b,c)(d) curry(sum)(a,b)(c,d)输出结果都等同于sum(a,b,c,d)
curry(sum)(1)(2)(3)(4)
compose函数
简而言之,compose函数可以把f(g(h(x)))这样的嵌套函数调用形式转变成compose(f,g,h)(x)
conpose函数&pip函数
redux中间件和webpack的loader都是用compose实现的。
手写compose:
const compose=function(){
let args=[...arguments];
return function(x){
return args.reduceRight((res,item)=>item(res),x);
}
}
var add=function add(a){
return a+1;
}
var div=function div(a){
return a/2;
}
const res=compose(add,div)(10)
console.log(res);
ES6装饰器
装饰器是一种特殊类型的声明,“非侵入式的行为修改。”,它能够被附加到类声明、方法,属性或参数上,从而实现扩展类、属性、方法、参数的功能。
常见的装饰器类型:
类装饰器
属性装饰器
方法装饰器
参数装饰器