柯里化

什么是js函数的currying/柯里化

说道js的柯里化,相信很多朋友都会头大,或者不是很清楚。用一句话总结柯里化,js柯里化是逐步传值,逐步缩小函数的适用范围,逐步求解的过程。

可能对这句话你不是很清楚,那么我们来看个案例,简单说明一下:

需求:我们写一个函数,将函数的几个参数相加,返回结果!那么我们写的函数如下:

函数柯里化呢?是分部求解,先传一个a参数,再传一个b参数,再传一个c参数,最后将这三个参数相加!

柯里化_第1张图片

我们看输出结果:

柯里化_第2张图片

柯里化案例

上面的需求我们稍微改变一下。现在我们更进一步,如果要求可传递的参数不止3个,可以传任意多个参数,当不传参数时输出结果?那我们现在用柯里化简单实现一下:

柯里化_第3张图片

上面adder是柯里化了的函数,它返回一个新的函数,新的函数接收可分批次接受新的参数,延迟到最后一次计算,我们可以任意传入参数,当不传参数的时候,输出计算结果!

基础知识普及之arguments

arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性,arguments非常类似Array,但实际上又不是一个Array实例。

柯里化_第4张图片

我们通常用  [].slice.call(arguments,1)

将传入参数转为数组。slice是js的一个函数,上面的写法相当于Array.prototype.slice.call(arguments,1)

另外,arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。

基础知识普及之reduce()方法


通用的柯里化函数

下面这个是通用的柯里化函数:

柯里化_第5张图片

我们可以通过如下函数简单应用一下柯里化:

柯里化_第6张图片

增加适用性的柯里化

还有一种是增加了函数的适用性,但同时也降低了函数的适用范围。其通用写法如下:

柯里化_第7张图片

例如:

柯里化_第8张图片

例子中,创建了map通用函数,用于适应不同的应用场景。显然,通用性不用怀疑。同时,例子中重复传入例如相同的处理函数:square

柯里化改造:

柯里化_第9张图片

Function.prototype.bind方法也是柯里化应用

与call/apply方法直接执行不同,bind方法将第一个参数设置为函数执行上下文,其他参数一次传递给调用方法(函数的主题本身不执行,可以看成是延迟执行),并动态创建返回一个新的函数,这符合柯里化特点

柯里化_第10张图片

关于函数柯里化就说到这里。

你可能感兴趣的:(柯里化)