闽公网安备 35020302035485号
function calculateTotalPrice(price, quantity, discount) {
return (price * quantity) - discount;
}
// 正常调用这个函数
console.log(calculateTotalPrice(10, 3, 5)); // 输出: 25
现在我们把它柯里化:
function curriedCalculateTotalPrice(price) {
return function(quantity) {
return function(discount) {
return (price * quantity) - discount;
}
}
}
// 堆代码 duidaima.com
// 调用柯里化后的函数
console.log(curriedCalculateTotalPrice(10)(3)(5)); // 输出: 25
通过柯里化,你可以一步一步地传递参数,而不是一次性全部传递。在实际应用中,这样的好处是,你可以预先设置某些固定参数,例如奶茶的价格,然后在需要的时候再传入数量和折扣,这样代码更加灵活和可复用。function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
}
}
}
}
// 堆代码 duidaima.com
// 示例用法
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // 输出: 24
以上例子中,我们定义了一个 curry 函数,该函数接受另一个函数 fn 作为参数,并返回一个新的柯里化函数 curried。curried 函数将参数收集到一个名为 args 的数组中。如果 args 的长度足以执行 fn,则调用 fn 并传递这些参数。如果不够,curried 返回一个新函数,用于收集更多的参数,并将其与现有的参数合并。const add = (a, b, c) => a + b + c; const curriedAdd = curry(add); // 部分应用第一个参数 const add5 = curriedAdd(5); console.log(add5(10)(20)); // 输出: 35 console.log(add5(1)(2)); // 输出: 83. 使用 lodash 库
const _ = require('lodash');
const curriedAdd = _.curry((a, b, c) => a + b + c);
console.log(curriedAdd(1)(2)(3)); // 输出: 6
4. 使用箭头函数实现简单柯里化const simpleCurry = fn =>
(...args) =>
args.length >= fn.length
? fn(...args)
: simpleCurry(fn.bind(null, ...args));
const add = (a, b, c) => a + b + c;
const curriedAdd = simpleCurry(add);
console.log(curriedAdd(1)(2)(3)); // 输出: 6
柯里化的应用场景const handleEvent = (type) => (event) => {
console.log(`Handling ${type} event`, event);
};
document.addEventListener('click', handleEvent('click'));
document.addEventListener('mouseover', handleEvent('mouseover'));
解释:const setFontSize = (size) => (element) => {
element.style.fontSize = `${size}px`;
};
const setFontSizeTo20 = setFontSize(20);
setFontSizeTo20(document.body);
解释:const map = (fn) => (arr) => arr.map(fn); const multiplyBy2 = (x) => x * 2; const mapMultiplyBy2 = map(multiplyBy2); console.log(mapMultiplyBy2([1, 2, 3])); // 输出: [2, 4, 6]解释:
通过将 multiplyBy2 传递给 map,我们得到了一个新函数 mapMultiplyBy2,它可以对数组中的每个元素乘以 2。