2026-01-14 11:06:13
以下是一个16行以内的简洁实现柯里化(Currying)的JavaScript代码,结合核心逻辑与注释说明:
// 自动柯里化函数实现function curry(fn) { return function curried(...args) { // 如果传入的参数数量 >= 原始函数的形参数量,则直接执行 if (args.length >= fn.length) { return fn.apply(this, args); } // 否则返回一个新的柯里化函数,继续收集参数 else { return function(...args2) { return curried.apply(this, args.concat(args2)); }; } };}关键点解析:闭包与递归
外层函数curry接收目标函数fn,返回一个柯里化后的函数curried。
curried函数通过...args收集参数,若参数不足则递归返回新函数,继续收集剩余参数。
参数数量判断
fn.length获取原始函数的形参数量(如function(a, b)的length为2)。
当args.length >= fn.length时,直接调用fn并传入所有参数。
参数合并
若参数不足,返回的新函数通过args.concat(args2)合并已收集和新增的参数,继续递归调用curried。
若需支持更复杂的场景(如保留this绑定),可优化为以下版本:
function curry(fn) { return function curried(...args) { if (args.length >= fn.length) { return fn.apply(this, args); } else { return (...args2) => curried.apply(this, [...args, ...args2]); } };}此版本使用箭头函数简化参数合并逻辑,同时保持this的正确性。