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)); // 输出: 64. 使用箭头函数实现简单柯里化
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。