Каррирование функций
Преобразуйте функции с несколькими аргументами в цепочки.
«Каррирование функций» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.
Что такое каррирование
Каррирование преобразует функцию, принимающую несколько аргументов, в последовательность функций, каждая из которых принимает один аргумент.
Вместо add(1, 2, 3) вызывают add(1)(2)(3). Каждый вызов возвращает следующую функцию, пока все аргументы не будут собраны.
Каррирование вручную
Самый понятный способ увидеть каррирование — написать вложенные функции, каждая из которых возвращает следующую и замыкает предыдущие аргументы.
function add(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
console.log(add(1)(2)(3));Вложенные стрелочные возвращаемые функции
Стрелочные функции делают определения каррированных функций короче. Каждый => возвращает следующую стрелочную функцию, а последняя выполняет работу.
const add = a => b => c => a + b + c;
console.log(add(1)(2)(3));
console.log(add(10)(20)(30));Замыкания запоминают аргументы
Каррирование основано на замыканиях. Каждая возвращённая функция сохраняет ссылку на переменные из внешней области видимости, поэтому предыдущие аргументы остаются доступными до выполнения последнего вызова.
const greet = greeting => name => greeting + ', ' + name + '!';
const sayHi = greet('Hi');
console.log(sayHi('Ada'));
console.log(sayHi('Grace'));Пошаговый вызов
Необязательно применять все аргументы сразу. Можно остановиться на полпути и сохранить промежуточный результат в переменной для повторного использования.
const add = a => b => c => a + b + c;
const addOne = add(1);
const addOneAndTwo = addOne(2);
console.log(addOneAndTwo(3));
console.log(addOneAndTwo(100));Универсальная вспомогательная функция curry
Писать вложенные функции вручную утомительно. Универсальная вспомогательная функция curry собирает аргументы, пока их не станет достаточно, а затем вызывает исходную функцию.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1)(2)(3));Гибкие вызовы с curry
Хороший вспомогательный инструмент curry принимает аргументы в любой разбивке на группы. fn.length сообщает ему, сколько параметров объявила исходная функция.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1, 2, 3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));Специализация с помощью каррирования
Каррирование естественным образом упрощает специализацию: передайте первый аргумент и повторно используйте возвращённую функцию во множестве вызовов.
const multiply = a => b => a * b;
const double = multiply(2);
const triple = multiply(3);
console.log(double(5));
console.log(triple(5));Каррирование с методами массивов
Curried-функции идеально подходят для map и filter, потому что каждая из них создаёт функцию с одним аргументом, готовую принять очередной элемент.
const greaterThan = min => value => value > min;
const over10 = greaterThan(10);
console.log([5, 12, 8, 20].filter(over10));Каррирование и частичное применение
Частичное применение фиксирует некоторые аргументы, а остальные оставляет для одного последующего вызова. Каррирование всегда разбивает функцию на цепочку вызовов с одним аргументом.
Каррирование — это конкретная, полностью разложенная форма частичного применения.
const partial = (a, b) => c => a + b + c;
const curried = a => b => c => a + b + c;
console.log(partial(1, 2)(3));
console.log(curried(1)(2)(3));Зачем нужно каррирование
Каррирование способствует созданию небольших, компонуемых и повторно используемых функций. Оно естественно сочетается с композицией функций, которую вы изучите далее. Главная идея: curried-функция никогда не бывает «незавершённой» — она просто возвращает другую функцию, пока не получит все необходимые аргументы.
const tag = name => content => '<' + name + '>' + content + '</' + name + '>';
const bold = tag('b');
console.log(bold('important'));
console.log(tag('i')('slanted'));Быстрая проверка
Дано const add = a => b => c => a + b + c;. Каким будет результат вычисления add(1)(2)?
Повторение: каррирование
Вы научились разлагать функции на цепочки вызовов с одним аргументом:
- Curried-функции возвращают новую функцию для каждого аргумента с помощью замыканий.
- Вложенные стрелочные функции позволяют компактно определять каррированные функции.
- Обобщённый вспомогательный инструмент
curryиспользуетfn.length, чтобы определить, когда передано достаточно аргументов. - Каррирование обеспечивает аккуратную специализацию и композицию.
Часто задаваемые вопросы
Урок «Каррирование функций» бесплатный?
Да — полный текст урока «Каррирование функций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Каррирование функций»?
Преобразуйте функции с несколькими аргументами в цепочки. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Каррирование функций»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Частичное применение
- Каррирование функций
- Композиция функций
- Создание pipe и compose