Skip to content

Javascript 柯里化

Published: at 12:24 PM

一、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' });