函数柯里化底层原理是闭包保存参数与递归判断执行时机:闭包使内部函数持续访问外部变量以累积参数,fn.length作为形参个数阈值决定是否执行,递归或累加合并参数并用apply/call正确绑定this与参数顺序。

函数柯里化底层原理,核心就两点:闭包保存参数 + 递归判断是否该执行。
闭包是参数的“记忆仓库”
每次调用柯里化后的函数,它不会立刻执行原函数,而是把传进来的参数记在自己作用域里。这个“记住”的能力靠的就是闭包——内部函数能持续访问外部函数的变量。比如 curried(1) 把 1 存下来,curried(1)(2) 再把 2 和之前的 1 合并,这些值始终没丢。
fn.length 是“通关条件”
JavaScript 函数对象自带 length 属性,值等于它定义时的形参个数(不包括 rest 参数)。柯里化函数靠它判断:“我到底要收几个参数才够?” 比如 sum(a, b, c) 的 length 是 3,那就一直收、一直返回新函数,直到累计参数 ≥ 3 才真正调用 sum。
递归或累加实现“分步收集”
常见实现有两种思路:
- 每次只收一个参数,用数组 concat 累积,再递归调用自身
- 一次性收一组参数(比如 curried(1, 2)),合并后判断总数,不够就返回新函数继续等
无论哪种,本质都是把“当前已有的参数”和“新来的参数”拼一起,再决定下一步是继续等,还是执行。
this 和参数传递要稳住
执行原函数时,不能丢掉调用上下文(this)和真实参数顺序。所以必须用 fn.apply(this, args) 或 fn.call(this, ...args),确保原函数像被直接调用一样运行。











