占位符\_是预留空位而非忽略参数,用symbol实现唯一性避免冲突;参数按位置填充至长度为fn.length的数组,仅当所有位置均非\_时才执行原函数。

占位符的本质是“预留空位”,不是跳过参数
在柯里化中,_ 不代表“忽略这个参数”,而是标记“此处暂无值,但位置必须保留”。比如三参数函数 f(a, b, c),调用 f(1, _, 3) 后,实际已确定第1位是 1、第3位是 3,只缺第2位。只有当所有非占位符位置都被填满,函数才执行。
实现关键:用 Symbol 做唯一占位符标识
避免用字符串 "_" 或 null,因为它们可能和真实业务参数冲突。推荐写法:
const _ = Symbol('curry placeholder');
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- Symbol 是唯一值,不会与任何用户传入的参数相等
- 每次比较是否“已填”时,只需判断
arg !== _ - 合并参数时,新参数只覆盖对应位置的 _,不覆盖已有真实值
参数合并逻辑要重写
基础柯里化靠 args.concat(newArgs) 累积,但支持占位符后,必须按位置填充:
- 维护一个长度为原函数
fn.length的数组,初始全为 _ - 每次调用时,把新参数按顺序填入数组中第一个 _ 的位置(顺序填充),或按显式位置填(如
f(1, _, 3)明确指定第1、第3位) - 更实用的做法是:允许混合调用,例如
add(_, 2)(1, _, 3)→ 表示第1位补1、第2位已是2、第3位补3,最终执行add(1, 2, 3)
执行判定不能只看参数个数
原来用 mergedArgs.length >= arity 就执行,现在必须检查“是否所有位置都非占位符”:
- 遍历累积的参数数组,确认
every(arg => arg !== _) - 只要还有一个 _,就返回新的柯里化函数
- 一旦全部填满,立刻用该数组展开调用原函数:
fn(...filled)










