函数柯里化
将多参数函数转换为调用链。
函数柯里化 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。
什么是柯里化?
柯里化会将一个接受多个参数的函数转换为一系列函数,每个函数只接受一个参数。
您不再调用 add(1, 2, 3),而是调用 add(1)(2)(3)。每次调用都会返回下一个函数,直到收集完所有参数。
手动实现柯里化
要理解柯里化,最清晰的方法是编写嵌套函数:每个函数都返回下一个函数,并通过闭包捕获之前的参数。
function add(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
console.log(add(1)(2)(3));嵌套箭头函数返回
箭头函数可以让柯里化定义更加简短。每个 => 都会返回下一个箭头函数,最后一个箭头函数负责执行实际操作。
const add = a => b => c => a + b + c;
console.log(add(1)(2)(3));
console.log(add(10)(20)(30));闭包记住参数
柯里化依赖于闭包。每个返回的函数都会保留对外部作用域中变量的引用,因此之前的参数在最后一次调用执行前始终可用。
const greet = greeting => name => greeting + ', ' + name + '!';
const sayHi = greet('Hi');
console.log(sayHi('Ada'));
console.log(sayHi('Grace'));逐步调用
您不必一次应用所有参数。可以在中途停下来,并将部分结果保存在变量中以便复用。
const add = a => b => c => a + b + c;
const addOne = add(1);
const addOneAndTwo = addOne(2);
console.log(addOneAndTwo(3));
console.log(addOneAndTwo(100));通用的 curry 辅助函数
手动编写嵌套函数很繁琐。通用的 curry 辅助函数会持续收集参数,直到参数数量足够,然后调用原始函数。
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1)(2)(3));使用柯里化灵活调用
一个好的 curry 辅助函数可以接受任意分组方式的参数。fn.length 会告诉它原始函数声明了多少个参数。
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1, 2, 3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));通过柯里化实现特化
柯里化让特化变得自然:应用第一个参数,然后在多次调用中复用返回的函数。
const multiply = a => b => a * b;
const double = multiply(2);
const triple = multiply(3);
console.log(double(5));
console.log(triple(5));使用数组方法进行柯里化
柯里化函数非常适合放入 map 和 filter,因为每个函数都会产生一个单参数函数,随时可以接收每个元素。
const greaterThan = min => value => value > min;
const over10 = greaterThan(10);
console.log([5, 12, 8, 20].filter(over10));柯里化与部分应用
部分应用固定某些参数,并把其余参数留给之后的一次调用。柯里化则始终把函数拆分为一连串单参数调用。
柯里化是部分应用的一种具体且完全分解的形式。
const partial = (a, b) => c => a + b + c;
const curried = a => b => c => a + b + c;
console.log(partial(1, 2)(3));
console.log(curried(1)(2)(3));为什么使用柯里化
柯里化鼓励使用小巧、可组合、可复用的函数。它与函数组合天然契合,您将在下一部分探索函数组合。关键在于:柯里化函数从来不是“不完整的”,它只是在获得所需参数前持续返回另一个函数。
const tag = name => content => '<' + name + '>' + content + '</' + name + '>';
const bold = tag('b');
console.log(bold('important'));
console.log(tag('i')('slanted'));快速检查
给定 const add = a => b => c => a + b + c;,add(1)(2) 的结果是什么?
回顾:柯里化
您已经学会将函数分解为单参数链:
- 柯里化函数通过 闭包针对每个参数返回一个新函数。
- 嵌套箭头函数可以简洁地定义柯里化函数。
- 通用的
curry辅助函数使用fn.length来判断是否已经传入足够的参数。 - 柯里化支持清晰的特化与函数组合。
常见问题解答
「函数柯里化」课时是免费的吗?
是的 — 「函数柯里化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。
「函数柯里化」这节课中我会学到什么?
将多参数函数转换为调用链。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「函数柯里化」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。