柯里化的个人理解(七日打卡)

114 阅读3分钟

前两天一直在看柯里化,之前并不能理解柯里化到底是什么,使用柯里化有什么用(太笨了,没办法) 

然后趁着休息的时间,看了几篇有关柯里化的文章

柯里化是什么 

“柯里化是函数式编程的一个过程,在这个过程中我们能把一个带有多个参数的函数转换成一系列的嵌套函数。它返回一个新函数,这个新函数期望传入下一个参数。它不断地返回新函数,直到所有的参数都被使用。参数会一直保持 alive(通过闭包),当柯里化函数链中最后一个函数被返回和调用的时候,它们会用于执行。” 

柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程。

差不多就是 fn(a, b, c, d,...,n) => fn(a)(b)(c)...(n)这样的形式

看到这里又不得不问一句,这个函数式编程又是啥?

怀着一个来自穷乡僻壤小少年对知识的渴望,我又去了解了下函数式编程。 “函数式编程是一种编程风格,它可以将函数作为参数传递,并返回没有副作用(改变程序状态)的函数。”

到这里我就能理解一部分了,毕竟工作中还是有遇到过以函数为参数传递的函数,举例如下:

 lodash库内的防抖和节流(目前我只用到这两个)
_.debounce(fn, [wait = 0], [options = {}]) 
_.throttle(fn, [wait = 0], [options = {}]) 
定时器 
setTimeout(fn, millisec, lang) 
setInterval(fn, millisec, lang) 

 这几个应该能算得上是比较常用的函数式编程了,那柯里化又是怎样的一种函数式编程呢?

 看了大多数例子,都是举例a+b+c或者a*b*c,我整个人都是懵的,如果柯里化就是干这种事的,那我直接使用式子不就行了吗,我为啥还弄这么麻烦呢?

然后我就仔细琢磨了下柯里化的作用 

柯里化能干什么 

1. 延迟计算 

按照柯里化的说法,在没有调用或者返回最后一个函数之前,是不会执行并且处于闭包状态的。这就意味着可以将其封装起来,待需要使用的时候再进行调用执行。例如bind()方法,bind()将方法和当前this进行绑定,并返回了一个fn,等需要使用的时候直接调用fn() 

2.参数复用 

某些情况下,可能会多次调用同一个函数,并且有部分参数是相同的,这时候就可以把那部分会重复提交的参数通过柯里化提前处理,之后只需要传入变化的参数即可

其他暂时也没想到具体有什么好处,可能是由于日常开发过程中并没有尝试使用柯里化的形式进行开发,也几乎用不到这种形式,不过多学习有备无患。