一、JavaScript 柯里化是什么
柯里化(Currying)是函数式编程中的一种技术,它将接收多个参数的函数转换为接收一个参数的函数链。每个函数返回一个新的函数,接受下一个参数,直到所有参数被处理完毕为止。这样可以使函数的复用性更高,并简化函数调用。
示例
function add(a) {
return function(b) {
return a + b;
};
}
const addFive = add(5);
console.log(addFive(3)); // 输出 8
二、有哪些使用场景
1、参数复用:当某个参数在多个函数调用中保持不变时,柯里化可以帮助简化代码。
function applyDiscount(discount) {
return function(price) {
return price * (1 - discount);
};
}
const tenPercentOff = applyDiscount(0.10);
console.log(tenPercentOff(100)); // 输出 90
console.log(tenPercentOff(200)); // 输出 180
2、延迟计算:通过柯里化,可以分步传递参数,允许延迟计算或在必要时再执行。
function multiply(a) {
return function(b) {
return a * b;
};
}
const multiplyByFive = multiply(5);
console.log(multiplyByFive(10)); // 输出 50
3、函数组合:柯里化可以更容易地组合和创建新的函数。
function compose(f, g) {
return function(x) {
return f(g(x));
};
}
const addOne = x => x + 1;
const double = x => x * 2;
const addOneThenDouble = compose(double, addOne);
console.log(addOneThenDouble(5)); // 输出 12
三、实战订单按钮点击功能
需求背景
在电商网站中,不同的按钮可能需要执行不同的操作,例如查看订单详情、取消订单或重复下单。这些操作都需要传递订单ID和其他相关参数。所以我们就可以利用柯里化来优化我们的代码
function handleOrder(orderId) {
return function(action) {
return function(extraParams) {
// 模拟不同的操作
switch(action) {
case 'view':
console.log(`查看订单 ${orderId}`, extraParams);
break;
case 'cancel':
console.log(`取消订单 ${orderId}`, extraParams);
break;
case 'repeat':
console.log(`重复下单 ${orderId}`, extraParams);
break;
default:
console.log('未知操作');
}
};
};
}
// 使用柯里化
const currentOrder = handleOrder('12345');
const viewOrder = currentOrder('view');
const cancelOrder = currentOrder('cancel');
// 执行具体操作
viewOrder({ user: 'Alice' });
cancelOrder({ reason: 'Changed mind' });