JavaScript中偏应用是预先固定部分参数并返回新函数,不强制单参数调用或立即求值;可用闭包、bind或带占位符的自定义实现,区别于柯里化。

JavaScript 中实现函数的偏应用(Partial Application)就是预先固定一部分参数,返回一个新函数,等后续再传入剩余参数执行。它和柯里化(Currying)不同:偏应用不强制每次只传一个参数,也不一定立即求值,而是灵活“预填”任意个已知参数。
基础手动实现方式
最直观的方法是用 闭包 保存预设参数,再用 arguments 或展开运算符收集后续参数:
function partial(fn, ...presetArgs) {
return function(...laterArgs) {
return fn(...presetArgs, ...laterArgs);
};
}
<p>// 示例
function add(a, b, c) { return a + b + c; }
const add5 = partial(add, 5); // 预填第一个参数
const add5And10 = partial(add, 5, 10); // 预填前两个参数</p><p>add5(10, 15); // → 30
add5And10(20); // → 35</p>利用 bind 实现(简洁可靠)
Function.prototype.bind 天然支持偏应用:它会绑定 this 和部分参数,返回新函数,且不立即执行。
- 第一个参数指定
this值(若无对象上下文可传null) - 后续参数即为预设参数,顺序严格对应原函数形参
const multiply = (a, b, c) => a * b * c; const double = multiply.bind(null, 2); // 相当于 (b, c) => 2 * b * c const doubleAndTriple = multiply.bind(null, 2, 3); // 相当于 (c) => 2 * 3 * c <p>double(4, 5); // → 40 doubleAndTriple(6); // → 36</p>
支持占位符的增强版 partial(类似 Lodash)
真实项目中常需“跳过”某些位置填参(比如只填第1和第3个参数)。可用特殊占位符(如 _)标记待填位置:
立即学习“Java免费学习笔记(深入)”;
const _ = Symbol('placeholder');
<p>function partial(fn, ...presetArgs) {
return function(...laterArgs) {
const args = [];
let laterIndex = 0;
for (const arg of presetArgs) {
if (arg === _) {
args.push(laterArgs[laterIndex++]);
} else {
args.push(arg);
}
}
// 补齐剩余未消费的 laterArgs
while (laterIndex < laterArgs.length) {
args.push(laterArgs[laterIndex++]);
}
return fn(...args);
};
}</p><p>// 示例:只预设 a=10 和 c=100,b 留空
function calc(a, b, c) { return a <em> b + c; }
const fn = partial(calc, 10, _, 100);
fn(5); // → 10 </em> 5 + 100 = 150</p>注意事项与对比
- 偏应用返回的是**新函数**,原函数不变;不是修改原函数,也不影响调用逻辑
- 不同于柯里化:偏应用不要求“逐步收参”,也不自动拆解多参函数为单参链
- bind 方式简单高效,但无法支持占位符;自定义实现更灵活,适合复杂场景
- ES6+ 推荐优先用扩展运算符和箭头函数,避免
arguments的兼容性问题


















