理解“柯里化”函数,其实不难

以前就听过柯里化函数,但是一听到这个词就感觉”好洋气,肯定很难”,这是我一看到这个词真实的想法,最近着重学习了一下,学习“新知识”好爽呀~

“柯里化函数”概念

用通俗的话简单概括

当小函数执行,需要用到第一次存储的这些值,直接基于作用域链的机制获取使用即可,所以我们可以说,闭包起到了一个“预先存储一些值的作用,供其下级上下文后期调取使用,我们把这种预先处理的思想,称之为“柯里化函数”

柯里化函数小例子
const fn = function (...params){
    // params是一个数组,存储的是外层函数传递的实参信息[ES6剩余运算符]
    // +鸭子函数:params = [].slice.call(arguments)
    return function proxy(...args) {
        // args是一个数组,数组中存储小函数传递的实参信息
        // + params:[1,2]
        // +args:[3]
        params = params.concat(args)
        // 数组求和1:命令式编程[关注的是过程,自己管控处理的步骤 优势:灵活 弊端:复杂冗余]
        let total = 0;
            i = 0;
            len =params.length;
            for(;i<len;i++){
                total+=params[i]
            }
        return total;
    }
}
let res = fn(1,2)(3)
console.log(res)
复制代码

上面这个例子如果你理解了就完美的理解了柯里化。
注意上面例子对柯里化的应用

  • 使用函数表达式 避免变量提升
  • 柯里化函数就是闭包的一种应用
  • 经典的闭包应用:大函数执行,产生一个闭包,存储了第一次传递的实参信息[闭包的保存作用]
另外下面介绍除了上面例子中的数组求和其他的另外几种常用的数组求和方法。

函数式编程

函数式编程:[关注的是结果,把具体实现的步骤封装成一个函数,后期只需要执行函数即可,没必要自己去实现这个过程]
优势:使用简便 弊端:无法灵活掌控 =>推荐使用函数式编程

 let total = 0;
        params.forEach((item,index) =>{
            total+=item;
        })
 return total;
复制代码

“投机取巧”

return eval(params.join('+'))
复制代码

介绍第4种方法之前,我们先要介绍一下数组的reduce API

reduce API

reduce也是用来迭代数组中每一项的,只不过,它可以把上一次处理的结果,直接传递给下一次处理,实现每一次处理的累计。

let arr = [10,20,30,40]
// 第一次:total数组第一项,从第二项开始迭代数组
arr.reduce((total,item,index) =>{
    console.log(total,item,index)
    // 10 20 1
    // 30 30 2
    // 60 40 3
    // reduce的是啥,就把其当作本次处理结果,传递给下一次迭代
    return total + item;  // =>100
})

// 如果reduce传递了第二个值,那么total初始值就是第二个值,数组从第一项开始迭代...
arr.reduce(function(total,item,index){
    console.log(total,item,index);
    // 0 10 0;  ->10
    // 10 20 1; ->30
    // 30 30 2; ->60
    // 60 40 3 ;->100
},0)
复制代码

reduce数组求和

// 数组求和4:reduce
        return params.reduce((total,item) =>{
            return total + item
        },0)
复制代码

前端路漫漫其修远兮,吾将上下而求索,一起加油,学习前端吧:stuck_out_tongue_closed_eyes:~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享