柯里化函数
标题 | 内容 |
---|
柯里化 | 定义,特点,作用 |
柯里化实例 | 实现一个柯里化函数 |
定义
- 柯里化(Curring)是把接受多个参数的函数变换成接受一个单一参数(这里指最初函数的第一个参数)的函数,之前的多个参数剩下的参数怎么处理了?
- 剩余的参数被放到了新的函数里面,这个新的函数就是接受一个单一参数的函数返回的函数,整体理解如下:
- 之前接受多个参数的函数
function test(a, b) {}
变成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
function test(a, b) {
return a * a + b * b;
}
// curring
function testCurring(a) {
return function(b) {
return a * a + b * b;
}
}
特点
- 我们刚刚说明清楚了柯里化定义,其实就是传递参数拆分开,但是返回函数这个特性是因为JavaScript闭包的存在,所以对于实现柯里化有天然的优势。
- 将多个参数拆分为一个一个参数的形式,我们细想一下发现拆分之后我们更加清晰了每一个函数的作用以及每一个参数的作用,这其实就是函数式编程的思想,从每一个函数和每一个参数出发去追述整体函数的作用,也就是局部入手去看全局,这也是柯里化的特点。
- 但是,上面的实例只是特定的实例,有没有通用的实例,我自己问自己,应该是有的,如下:
// 通用版
var curring = function(func) {
var _args = [].slice.call(arguments, 1);
return function() {
args = _args.concat([].slice.call(arguments));
func.apply(null, args);
}
}
作用
- 或者也可以说是好处,其实从特点中可以得到一个作用
- 在我们注意每一个参数的作用时,柯里化是我们的选择(比如每个参数都是一样的时候或者多个参数中有类似的参数的时候);
- 代码需要更加清晰知道数据流向的时候(每一个参数的都可以追述);
- 参数之间有明显的先后顺序的时候(比如参数a就是比参数b在前面,就需要);
实例
/**
|| =================================================================================
||
|| Filename: 1290-柯里化.js
|| Description:
|| Problem Description:
||
|| 已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
|| 1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
|| 2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
|| 3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
|| 4、调用 c 之后,返回的结果与调用 fn 的返回值一致
|| 5、fn 的参数依次为函数 a, b, c 的调用参数
|| 输入例子:
|| var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
||
|| 输出例子:
|| 6
|| Version: 1.0
||
|| Created: 24/10/2016 09:53:32
|| Revision: none
|| Compiler: Firefox
||
|| Author: Jack Dan9 (https://www.github.com/JackDan9), J.Dan92016@gmail.com
|| AuthorBlog:http://my.csdn.net/XXJ19950917
||
|| =====================================================================================
*/
// 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,
// 并且返回接受余下的参数且返回结果的新函数的技术。
function curryIt(fn) {
return function a(xa){
return function b(xb){
return function c(xc){
return fn.call(this,xa,xb,xc);
};
};
};
}
注意
- 柯里化更多是数学当中的概念,方便函数拆分,一步一步求解得出整体的解,但是对于JavaScript来说它也是必不可少需要理解的特点。
Thinking in JackDan
1290-柯里化
Curring Video
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。