高阶函数

245 阅读2分钟

高阶函数的概念

1.一个函数参数是一个函数, 我们可以将这个函数认作是高阶函数 2. 一个函数返回一个函数 也可以称之为高阶函数 这两点满足任何一个都是高阶函数

对原函数进行扩展,但是不破坏原函数

function fn(who){
    console.log("say",who)
}
//在Function的原型上扩展一个before方法,此方法的参数是一个函数
Function.prototype.before=function(beforefun){
    return (...args)=>{
        beforefun(...args);
        this(...args);
    }
}

let beforefn=(args)=>{
    console.log("before",args)
}

let newfn=fn.before(beforefn);//fn是Function的实例,通过原型链找到before方法,执行返回一个箭头函数

newfn("哈哈")
输出:before 哈哈
     say 哈哈
     
     

柯里化函数

柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术

实现一个参数的累加1

function add(a,b,c){
    return a+b+c;
}
let curring = (fn,...args) => {
  // 需要根据fn的长度 和 我们当前调用时传递的参数做比较, 比较两个数的大小,如果参数个数大于用户传递的参数 需要返回一个新的函数,否则让这个函数执行
  function inner(args) {
    // args 每次用户调用时的参数列表
    // 累计参数  [1] [2,3] =》 【1,2,3】
    return fn.length > args.length ? (...args2) => inner([...args,...args2]): fn(...args);
  }
  return inner(args);
};
// let fn1 = curring(sum);
// let fn2 = fn1(1);
// let r = fn2(2,3);
// console.log(r);

//借用上面的 curring函数
function isType(type,val) {
    return Object.prototype.toString.call(val) === `[object ${type}]`
}
let isString = curring(isType,'String')
let r = isString('4356')
console.log(r);

实现一个参数的累加2

function curring() {
    let params = [];
    let add = function (...args) {
        params = params.concat(args);
        return add;
    }
    add.toString = function () {
        return params.reduce((result, item) => result + item);
    };
    return add;
}
let add = curring();
let res = add(1)(2)(3);
console.log(+res);
// +res 把res转化为数字
// console.log(fn + 1); //会依次调取fn的 Symbol.toPrimitive/valueOf/toString 这三个属性