JavaScript - Currying: A Beginner's Guide

Здравствуйте, начинающие программисты! Сегодня мы отправимся в увлекательное путешествие в мир JavaScript и рассмотрим концепцию под названием "currying". Не волнуйтесь, если вы никогда о ней не слышали – мы начнем с азов и постепенно перейдем к более сложному материалу. К концу этого руководства вы будете currying функции как профессионал!

JavaScript - Currying

Что такое Currying?

Прежде чем мы углубимся в то, как это сделать, давайте разберемся, что же такое currying на самом деле. Currying - это техника в функциональном программировании, при которой мы преобразуем функцию, принимающую несколько аргументов, вsequence функций, каждая из которых принимает один аргумент.

Представьте, что вы делаете бутерброд. Вместо того чтобы сразу положить все ингредиенты вместе, currying похоже на добавление одного ингредиента за другим, шаг за шагом. Это дает вам больше контроля и гибкости в том, как вы создаете ваш "функциональный бутерброд".

Как достичь Currying в JavaScript

Теперь давайте посмотрим, как мы можем реализовать currying в JavaScript. Мы рассмотрим два основных метода: использование замыканий и использование метода bind().

Currying с использованием замыканий

Замыкания в JavaScript похожи на магические коробки, которые помнят окружающую среду, в которой они были созданы. Мы можем использовать эту суперсилу для создания curried функций. Давайте начнем с простого примера:

function curry(f) {
return function(a) {
return function(b) {
return f(a, b);
};
};
}

function sum(a, b) {
return a + b;
}

let curriedSum = curry(sum);

console.log(curriedSum(2)(3)); // Вывод: 5

В этом примере:

  1. curry - это функционально-высший порядок функции, которая принимает другую функцию f в качестве аргумента.
  2. Она возвращает новую функцию, которая принимает первый аргумент a, которая в свою очередь возвращает другую функцию, принимающую второй аргумент b.
  3. Наконец, она вызывает исходную функцию f с обоими аргументами.

Давайте разберем это по шагам:

  1. Мы определяем функцию curry, котораяtransformирует нашу обычную функцию в curried.
  2. У нас есть простая функция sum, которая складывает два числа.
  3. Мы создаем curriedSum, передавая sum в нашу функцию curry.
  4. Когда мы вызываем curriedSum(2)(3), это на самом деле делает следующее:
  • curriedSum(2) возвращает функцию, которая запоминает 2 в качестве первого аргумента.
  • Мы немедленно вызываем эту возвращенную функцию с (3), что завершает операцию.

Круто, правда? Это как если бы мы собирали вызов функции по частям!

Currying с использованием метода bind()

JavaScript также предоставляет нам встроенный метод под названием bind(), который мы можем использовать для currying. Метод bind() создает новую функцию, которая, когда вызывается, имеет了自己的 this keyword, установленным на предоставленное значение, с заданной последовательностью аргументов, предшествующих любым предоставленным при вызове новой функции.

Давайте посмотрим, как мы можем использовать bind() для currying:

function multiply(x, y) {
return x * y;
}

let multiplyByTwo = multiply.bind(this, 2);
console.log(multiplyByTwo(4)); // Вывод: 8

let multiplyByThree = multiply.bind(this, 3);
console.log(multiplyByThree(4)); // Вывод: 12

В этом примере:

  1. Мы начинаем с простой функции multiply, которая принимает два аргумента.
  2. Мы используем bind() для создания новой функции multiplyByTwo. Argument 2 устанавливается в качестве первого аргумента.
  3. Когда мы вызываем multiplyByTwo(4), это по сути вызывает multiply(2, 4).
  4. Мы делаем то же самое, чтобы создать multiplyByThree, устанавливая 3 в качестве первого аргумента.

Метод bind() позволяет нам "зафиксировать" определенные аргументы функции, создавая новую функцию с этими аргументами уже установлены.

Примеры использования Currying

Теперь, когда мы понимаем, как currying функции, давайте рассмотрим, почему мы можем хотеть это сделать. Currying имеет несколько практических применений в JavaScript:

  1. Функциональное composizione: Currying упрощает создание функций, где результат одной функции становится входом для другой.

  2. Частичное приложение: Мы можем создавать специализированные функции из более общих, как в нашем примере multiplyByTwo.

  3. Избегание повтора: Когда вы обнаруживаете, что вызовите функцию с одними и теми же аргументами снова и снова, currying может помочь уменьшить повторение.

  4. Обработка событий: В frontend-разработке currying может быть полезен для обработки событий с дополнительными параметрами.

Давайте рассмотрим реальный пример использования currying для обработки событий:

function handleClick(message, event) {
console.log(message, event.target);
}

let button = document.getElementById('myButton');
button.addEventListener('click', handleClick.bind(null, 'Button clicked:'));

В этом примере мы используем currying для передачи дополнительного параметра в нашу функцию обработки событий. Когда кнопка будет нажата, она выведет "Button clicked:" и цель события.

Методы для Currying в JavaScript

Вот таблица, резюмирующая методы, которые мы обсуждали для currying в JavaScript:

Метод Описание Пример
Замыкания Использует вложенные функции для создания curried функций function curry(f) { return function(a) { return function(b) { return f(a, b); }; }; }
bind() Использует метод bind() для presetting аргументов let multiplyByTwo = multiply.bind(this, 2);

Заключение

Поздравляю! Вы только что сделали первые шаги в мир currying в JavaScript. Помните, как при изучении любой новой концепции программирования, практика является ключом. Попробуйте создать свои собственные curried функции и поэкспериментируйте с различными случаями использования.

Currying может показаться немного абстрактным сначала, но по мере использования вы начнете видеть, как это может сделать ваш код более гибким и повторно используемым. Это как обучение использованию новой функции в вашем наборе инструментов программирования - сначала это может показаться неудобным, но вскоре вы будете задаваться вопросом, как вы когда-либо программировали без нее!

Продолжайте программировать, продолжайте учиться и, самое главное, получайте удовольствие! JavaScript - это игровая площадка возможностей, и currying - это только одна из многих увлекательных функций, которые ждут вас для исследования.

Credits: Image by storyset