什么是柯里化
柯里化,英文名称"currying",也就是库里的现在进行时,哈哈,完全可以翻译为库里化嘛。玩笑归玩笑,柯里化跟篮球运动可是没有什么关系了,它是在编译原理层面实现多参数函数的一种技术,也就是说,柯里化本质上是帮助编译语言底层实现一个函数可以具有多个形参的这么一种技术。柯里化的实现思路是把有多个参数的函数转换为接收一个单一参数的函数,这唯一的一个参数就是原参数中的第一个参数,之后函数要返回一个新函数,且新函数接收余下的参数,这种过程递归进行,直到返回最后一个只接受尾参数的函数为止。
说了这么多,我们对柯里化还是不能有直观的认识,下面我们来看下代码吧。
function multiply(a,b){
return a*b;
}
function curryMultiply(a){
return function(b){
return a*b;
}
}
从上面的代码可以看清楚,柯里化的函数确实只接受一个参数,其他参数作为返回函数的参数递归传递。同时,柯里化非常依赖JS中的作用域,因为需要使用作用域来保存之前的参数。其实这里也就是用到了闭包的概念。
柯里化的实现
比较多次接收的参数总数和函数定义时的形参总数,当接收的参数数目大于或等于Currying函数传入的参数数目时,就返回结果,否则返回一个继续接收参数的新函数。
function Currying(fn, ...args){
if(args.length >= fn.length){
return fn(...args);
}
return function(...args2){
return Currying(fn, ...args, ...args2);
}
}
柯里化的使用场景
- 参数复用
- 延迟执行
bind和箭头函数也能发挥同样的作用,一个典型的应用就是为标签添加点击事件,同时为绑定的方法传递参数。 - 函数式编程
柯里化的诟病
柯里化并不是完美的,它源于函数式编程,也被函数式编程所限制。JS并不是函数式编程语言,它实现柯里化需要额外的性能开销,而柯里化所实现的一些功能,bind和箭头函数也可以更好地完成。所以,柯里化的使用要按需选择。