偏应用
固定部分参数并重复使用函数。
偏应用 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。
什么是部分应用?
部分应用是指:对于一个需要多个参数的函数,预先固定其中一部分参数,生成一个只需要其余参数的新函数。
它让您可以从通用函数构建专用函数。通用的 multiply(a, b) 可以通过固定 a = 2,变成专用的 double(b)。
带有多个参数的函数
先从一个通用函数开始。这里的 add 接受三个数字。您经常需要使用相同的第一个参数反复调用它。
function add(a, b, c) {
return a + b + c;
}
console.log(add(1, 2, 3));
console.log(add(1, 10, 100));手动固定参数
最简单的部分应用,就是编写一个包装函数,将某个参数硬编码,并传递其余参数。
function add(a, b, c) {
return a + b + c;
}
function addTen(b, c) {
return add(10, b, c);
}
console.log(addTen(2, 3));
console.log(addTen(20, 30));使用 bind 进行部分应用
Function.prototype.bind 就是为此而设计的。它的第一个参数用于设置 this;后面的每个参数都会从左侧开始预先填充。
如果您不关心 this,请为它传入 null。
function add(a, b, c) {
return a + b + c;
}
const addTen = add.bind(null, 10);
console.log(addTen(2, 3));
console.log(addTen(20, 30));绑定多个参数
您可以一次固定多个开头的参数。返回的函数会接受剩余的参数。
function add(a, b, c) {
return a + b + c;
}
const addElevenAndTwo = add.bind(null, 11, 2);
console.log(addElevenAndTwo(7));
console.log(addElevenAndTwo(100));可复用的部分应用辅助函数
您可以自行编写 partial,使用剩余参数捕获预设参数,再通过展开运算符合后续参数。
function partial(fn, ...preset) {
return function (...later) {
return fn(...preset, ...later);
};
}
function greet(greeting, name) {
return greeting + ', ' + name + '!';
}
const sayHello = partial(greet, 'Hello');
console.log(sayHello('Ada'));
console.log(sayHello('Linus'));将通用函数专用化
当一个通用函数可以生成许多小巧、易读的专用函数时,部分应用尤其有用。
function multiply(a, b) {
return a * b;
}
const double = multiply.bind(null, 2);
const triple = multiply.bind(null, 3);
console.log(double(5));
console.log(triple(5));对数组使用部分应用
专用函数放在 map 等数组方法中时,代码会更加清晰。
function power(exponent, base) {
return Math.pow(base, exponent);
}
const square = power.bind(null, 2);
console.log([1, 2, 3, 4].map(square));预先填充配置
一个常见的实际用途是固定某个配置值,例如税率或货币符号,然后在各处重复使用结果。
function format(symbol, amount) {
return symbol + amount.toFixed(2);
}
const usd = format.bind(null, '$');
const eur = format.bind(null, '\u20AC');
console.log(usd(9.5));
console.log(eur(9.5));部分应用与默认参数
默认参数会在参数缺失时提供备用值。部分应用则会锁定一个值,使调用者无法再更改该参数位置上的值。
它们解决的是不同的问题:默认参数是可选的,部分应用是固定的。
function log(level, message) {
return '[' + level + '] ' + message;
}
const error = log.bind(null, 'ERROR');
console.log(error('Disk full'));
console.log(error('Timeout'));部分应用为何重要
部分应用可以减少重复,清晰地表达意图,也是柯里化的基础。每当您反复传入相同的第一个参数时,都可以考虑将它固定一次。
function between(min, max, value) {
return value >= min && value <= max;
}
const isPercentage = between.bind(null, 0, 100);
console.log(isPercentage(50));
console.log(isPercentage(150));快速检查
fn.bind(null, 5) 会返回什么?
回顾:部分应用
您已经学会了如何预先固定参数:
- 手动包装函数会硬编码一个参数,并传递其余参数。
- bind(null, ...args)会从左侧开始预先填充参数。
- 自定义的
partial辅助函数会使用剩余参数和展开运算符。 - 部分应用可以创建清晰、可复用的专用函数,并为柯里化做好准备。
常见问题解答
「偏应用」课时是免费的吗?
是的 — 「偏应用」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。
「偏应用」这节课中我会学到什么?
固定部分参数并重复使用函数。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「偏应用」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。