本质
将接受多个参数的函数变换为可接受单个参数并返回可接受剩余参数并返回的结果的函数。
简单🌰
// 原函数
function add(a,b){
return a + b;
}
// 被柯里化后的函数
function add(a){
return function(b){
return a+b;
}
}
原理
利用了闭包特性,保存了原来参数,最后再统一执行函数。
实现
function curry(fn, ...arg1){
// 当参数个数满足目标函数所需参数个数时,执行函数
if(arg1.length>= fn.length){
return fn(...arg1);
}
return function (...arg2){
return curry(fn, ...arg1, ...arg2);
}
}
应用场景
1. 参数复用
function add(a,b){
return a+b;
}
const increase = curry(add,1);// 此后再调用increase函数都有加一的功能,复用了固定不变的参数。
2. 延迟执行
日常开发中常见于事件绑定函数,在绑定函数的同时确定好传入的参数,想传入data,如下:
<div onClick=curry(clickHandler, data)></div>
当然这只是常用场景之一,并不是说该场景下必须用柯里化的方式,比如完全可以用箭头函数来解决,()=>clickHandler(data).
应用实例
redux中间件(详细见下篇)