Рубрики
Без рубрики

JavaScript: функциональное программирование

Функциональное программирование (FP) – это парадигма, используемая для создания компьютерных приложений, применяющих и сочиняющих … Tagged with JavaScript, функциональный.

Функциональное программирование (FP) – это парадигма, используемая для создания компьютерных приложений, применяющих и сочиняющих чистые функции без мутирования состояния и данных. Это также декларативный тип программирования, который реализует логику процесса, не объясняя его управляющий поток. Он использует выражения вместо утверждений.

Есть некоторые концепции, которые необходимо понять, если FP будет применен:

  • Чистые функции
  • Неизменные данные
  • Референциальная прозрачность
  • Функции первого класса
  • Функции высокого порядка
  • Рекурсия над петлями

Чистые функции

Чистая функция имеет две основные характеристики:

1. Функция, которая учитывает одинаковые входы, верните один и тот же выход. Например:

const double = x => x * 2

console.log(double(4)) // 8
console.log(double(4)) // 8
console.log(double(4)) // 8

Как видите, когда функция двойной вызывается с одним и тем же параметром (в данном случае 4), он всегда возвращает один и тот же результат.

Не все функции выполняют эту спецификацию. Это некоторые примеры функций, которые не являются чистыми:

Math.random() // 0.9475128240189292
Math.random() // 0.1712299774003645
Math.random() // 0.16032971104683935

(new Date()).getTime() // 1620616533928
(new Date()).getTime() // 1620616539849
(new Date()).getTime() // 1620616541638

В этом случае функции случайный и getTime не чисты, потому что, учитывая, что одинаковые параметры не возвращают одинаковое значение.

2. Не имеет побочных эффектов. Это означает, что функции не собираются менять какие -либо аргументы, глобальные переменные или делать какие -то ввод/вывода.

const animals = ["cat", "dog", "cow"]

const addSheepAnimal = (animalsArray) => {
  animalsArray.push('sheep')

  return animalsArray
}

const newAnimals = addSheepAnimal(animals)

console.log(newAnimals) // [ 'cat', 'dog', 'cow', 'sheep' ]
console.log(animals) // [ 'cat', 'dog', 'cow', 'sheep' ]

В примере выше, функция Addsheepanimal имеет побочный эффект над AnimalsArray Параметр, потому что меняет массив, который проходит при вызвании функции. Чтобы исправить это, массив должен быть клоном внутри функции, чтобы он не имел побочных эффектов.

const animals = ["cat", "dog", "cow"]

const addSheepAnimal = (animalsArray) => {
  return [...animalsArray, 'sheep']
}

const newAnimals = addSheepAnimal(animals)

console.log(newAnimals) // [ 'cat', 'dog', 'cow', 'sheep' ]
console.log(animals) // [ 'cat', 'dog', 'cow' ]

Неизменные данные

Данные неизменны, когда значения структур JavaScript не могут быть изменены после назначения. Это означает, что когда переменная уже назначена, значение не может быть изменено в следующих частях потока.

Это хорошая практика, всегда используйте const Объявление вместо var и пусть Таким образом, изменяемые данные можно избежать. Но мы должны иметь осторожность со массивами и объектами, чтобы не изменить ссылку на указатель, рекомендуется клонировать объект/массив, один раз передается в качестве параметра в функциях, если на них необходимо внести изменение, а затем вернуть новый объект Анкет

Референциальная прозрачность

Сумма Чистые функции плюс Необываемые данные Возвращает Референциальная прозрачность . Функция не будет изменять какие -либо глобальные переменные и будет работать только с их переменными объема. Как только функция вернет значение, она будет назначена новой переменной. Пример:

const number = 3;

const square = x => x ** 2;

const result = square(number)

console.log(result) // 9

Первоклассные функции

Первоклассные функции являются функциями, которые рассматриваются как переменные и могут передаваться другим функциям в качестве аргументов.

const numbers = [2, 5, 3, 8, 10];

const double = (x) => x * 2;

const doubleNumbers = numbers.map(double);

console.log(doubleNumbers) // [ 4, 10, 6, 16, 20 ]

В примере выше, двойной Функция считается Первоклассная функция потому что рассматривается как переменная, а также передается в карта функция

Функции высокого порядка

Функции высокого порядка являются функциями, которые принимают другие функции в качестве аргументов или возвращают функцию в качестве вывода.

Ассистенные процедуры, такие как карта , уменьшить или фильтр считаются функции высокого порядка . Кроме того, могут быть созданы методы, которые соответствуют этому определению.

Рекурсия вместо петель

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

// Loop

let loopSum = 0
const loopLimit = 15

for (let i = 0; i <= loopLimit; i++) {
   loopSum += i;
}

console.log(loopSum) // 120


// Recursion

const recLimit = 15

const sumNum = (val, lim) => {
  if(val <= lim) {
    return val + sumNum(val + 1, lim)
  }

  return 0
}

console.log(sumNum(0, recLimit)) // 120

В этом предыдущем сценарии мы сделали пример и рекурсию. Мы можем заметить, как изменяет цикл глобальной переменной Loopsum в каждом цикле. Вместо этого рекурсивный способ не изменил какое -либо состояние, которое не принадлежит его масштабу.

Завершая

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

Оригинал: “https://dev.to/kenneth058/javascript-functional-programming-37m5”