Частичное применение
Фиксируйте некоторые аргументы и повторно используйте функции.
«Частичное применение» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.
Что такое частичное применение
Частичное применение означает, что у функции, которой требуется несколько аргументов, заранее фиксируют некоторые из них, получая новую функцию, которой нужны только остальные.
Это позволяет создавать специализированные функции на основе общих. Например, обобщённая функция multiply(a, b) может превратиться в специализированную double(b), если зафиксировать a = 2.
Функция с несколькими аргументами
Начните с функции общего назначения. Здесь 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, а каждый следующий аргумент предварительно заполняется слева.
Передайте null для this, если его значение не имеет значения.
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
Можно написать собственную функцию partial, которая захватывает заранее заданные аргументы с помощью параметра rest и объединяет их с последующими аргументами с помощью spread.
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использует rest и spread. - Частичное применение создаёт понятные, пригодные для повторного использования специализации и подготавливает почву для каррирования.
Часто задаваемые вопросы
Урок «Частичное применение» бесплатный?
Да — полный текст урока «Частичное применение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Частичное применение»?
Фиксируйте некоторые аргументы и повторно используйте функции. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Частичное применение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Частичное применение
- Каррирование функций
- Композиция функций
- Создание pipe и compose