定义
柯里化(Currying) 是把接受多个参数的函数 变换成 接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果为新函数的技术。
属于 函数式编程(Functional programming)范式中的, 函数式编程 是 与 面向对象编程 和 过程式编程 并列的编程范式。由于是与运筹学有关,其中多与数学相关,不考虑性能。
举例:计算 (a+b)*c
实现函数可以是调用 f(a, b, c)
, 柯里化方式就是 f(a)(b)(c)
或者 f(a)(b)(c)()
这种方法调用
使用场景
有利于阅读源码,也比较便于数学计算方面的代码阅读
特点
- 参数复用:利用闭包实现了参数的暂存
- 提前确认:确定好了每一步输入走的逻辑
- 延迟运行:利用闭包将函数的定义与执行环境分开
实现
原理
- 闭包来保存参数
- 高阶函数实现运算
call 和 apply
call
和apply
都是改变函数体内部this
的指向,this
是函数在运行的时候才确定的值,即函数运行时的上下文context
- call 和 apply 作用完全相同,区别是接受参数的方式上。call 是 apply 的一种语法糖。
- 格式:
apply(context, [arguments])
,call(context, param1, param2, ...)
简单函数柯里化
利用 函数 实现两数相加 a + b
运算:
1 | // 两数相加 |
将 函数进行柯里化:
1 | function add(x, y){ |
运行如下:
公共的柯里化函数
1 | // 定义一个createCurry的函数 |
函数的 arguments
是一个类数组,是有 length
属性的对象。
运行如下:
1 | function add(x, y) { |
可以看出,无论参数传入几个,这里只能进行一次函数的柯里化,所以调用的时候,第一步传参调用是得到柯里化的函数,第二步传参调用才是真正的执行函数。
灵活的柯里化函数
希望函数分为多步执行:
1 | // 创建一个可以多步执行的柯里化函数,当参数满足数量时就去执行它: |
运行如下:
1 | // 多个参数的普通函数 |
当参数符合该函数时,我们需要直接调用 函数即可,不要再次调用执行,修改如下:
1 | var createCurry = (fn,...params)=> { |
可以控制执行时间的柯里化函数
控制执行时间就是一直返回的是柯里化之后的函数,直到传参足够,并且再次调用一次柯里化的函数才执行,否则不执行,即修改如下:
1 | // 当参数满足,再次执行时调用函数 |
参数不够时就执行那么就在执行函数柯里化,如果参数够了执行就是在执行了,所以自己在调用 createCurry
的时候,需要对需要柯里化的函数的参数长度有所了解。
参考链接如下: