柯里化是将多元函数转换为一元函数连续调用的技术,核心是逐步传参、闭包暂存、延迟求值;如add(a,b,c)可写成add(1)(2)(3),手动实现需用function声明、依赖fn.length判断、保留this上下文。

JS 中将多元函数转换为一元函数的连续调用,核心是 柯里化(Currying) —— 把接收多个参数的函数,变成每次只接收一个参数、返回新函数的过程,直到所有参数收齐才真正执行。
什么是柯里化?
例如原始函数:add(a, b, c),柯里化后可写成:add(1)(2)(3) 或 add(1)(2, 3)(取决于实现策略)。关键不是“必须严格一次一个”,而是支持“逐步传参 + 暂存上下文 + 延迟求值”。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
手动实现一个通用柯里化函数
以下是一个简洁可靠的实现,支持任意参数个数和灵活调用:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
}
};
}
-
原理:利用闭包保存已传参数,通过
fn.length判断是否达到原函数形参个数 -
支持多次少传:如
curried(1)(2, 3)或curried(1, 2)(3)都能正确触发执行 -
保留 this 上下文:使用
apply确保调用时的this正确传递
使用示例
定义一个普通加法函数并柯里化:
const add = (a, b, c) => a + b + c; const curriedAdd = curry(add); console.log(curriedAdd(1)(2)(3)); // 6 console.log(curriedAdd(1, 2)(3)); // 6 console.log(curriedAdd(1)(2, 3)); // 6 console.log(curriedAdd(1, 2, 3)); // 6
注意边界与常见误区
-
箭头函数无
arguments和length不可靠:柯里化函数本身不能是箭头函数(需用function声明),且被柯里化的函数应为常规函数(有明确length) -
默认参数会影响
fn.length:带默认值的参数不计入length,例如(a, b = 1, c) => {}的length是 1,会导致提前触发。建议柯里化前避免默认参数,或改用显式参数计数逻辑 - 不等于偏函数(Partial Application):偏函数是固定部分参数后立即返回新函数,不要求“逐个调用”,也不依赖参数个数判断;柯里化更强调“单参数优先”和自动终止逻辑

















