什么是函数柯里化
柯里化(Curring),又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。
柯里化特点
- 接受单一参数,将更多的参数通过回调函数来解决。
- 返回一个新的函数,用于处理所有的想要传入的参数。
- 需要利用call/apply与arguments伪数组收集参数。
- 返回的函数正是用来处理收集起来的参数。
需要理解JavaScript函数的隐式转换
JavaScript是一种弱类型语言,它的隐式转换是非常灵活的。
如下:
|
|
试着运行一下你会发现答案为:
接着我们在修改代码为:
你会发现答案为:20,接着我们在进行修改
答案为30
当我们使用console.log()或者进行运算时,隐式转换就可能会发生。从上面的例子我们可以得到如下结论:
当我们没有重新定义toString()与valueOf时,函数的隐式转换会调用默认的toString方法,他会将函数的定义内容转化为字符串返回。当我们主动定义了toString()/valueOf时,那么隐式转化的返回结果则由我们自己控制了。其中valueOf的优先级会比toString()高。
需要知道如何利用call/apply封装数组的map方法
map:对数组的每一项运行给定的函数,将每次函数调用返回的结果组成新的数组。
具体实现如下:
理解函数柯里化
考虑实现一个add方法,使结果能够满足如下预期:
add(1)(2) = 3
add(1,2,3)(4) = 10
add(1)(2)(3)(4)(5) = 15
一开始如果只有两个参数,你可能会这样写:
如果有三个的话,可以这样写:
如果有n个呢,难道要一直嵌套下去,而且2,3种情况也没有覆盖到。所以,要利用函数柯里化,利用闭包的特性,将所有参数,集中到最后的返回函数里进行计算并返回结果。因此,我们在写代码时,要将所有的参数集中起来处理。
具体实现如下:
我们再来考虑函数柯里化的例子
假如有一个计算要求,需要我们将数组里面的每一项用我们自己想要的字符给连接起来。我们该怎么做?
|
|
在考虑将数组每一位加一位数在连接起来
|
|
我们并不知道自己要对数组进行何种处理,所以我们要把对数组的操作封装起来。我们现在只知道需要将他们处理后用字符串连接起来,所以不妨将他们的处理内容保存在函数中,而仅仅固定封装连起来的部分。
|
|
柯里化通用式
|
|
柯里化与bind
|
|
参考链接 函数柯里化