Как да напишете собствената си тръбна функция в JS

Javascript е толкова динамичен, че можем да изберем много начини да напишем нашия код. Защо да не го направите по функционалния начин на програмиране?

Какво е тръбопровод на функции?

Спомняте ли си в гимназията, в час по математика, че сте имали две функции -
f (x) и g (x).
И тогава можете да създадете нова функция:
h (x) = f (g (x)).

Новата функция би приела аргумент и предава този аргумент два g (x) и след това предава оценената стойност на следващата функция = f (g).

И така, тръбните функции са същата основна идея, вие създавате нова функция, която ще „премине“ през няколко по-малки функции.

Писане чисто

Във функционалния свят ние обичаме да пишем чисти функции.

Функция считайте за чиста, ако:
1. Той получава всички параметри, от които се нуждае (не използва глобални променливи или членове на класа)
2. Винаги връщайте същия изход за даден вход
3. Няма страничен ефект (извикване на сървър, извличане на db, рендеринг на DOM и т.н.)

Чистите функции имат много предимства:
1. Това е тестируемо! Няма повече настройка или писане на макет клас
2. Това е кеш-способността - тези функции са детерминистични, защо да изчисляваме един и същ вход повече от веднъж?
Има готин модел, наречен запомняне, моля, проверете го.

И предимството, заради което сме тук, е:
3. Това е годно за композиране! можете да изпращате толкова функции, колкото искате, за да създадете по-сложна функция (или дори цяла функция).

Функцията за намаляване

Тъй като ще създадем функцията на тръбата въз основа на „Array.reduce ()“, ще я обясня накратко.

Redu () ще вземе елементите в масива, ще ги обработи и ще върне един елемент. Този един елемент може да бъде всяко нещо, дори функция, както ще видим в следващия раздел.

// Сума функция, получава масив и връща сумата
// es5 стил, mabye е по-ясно
функция sum_es5 (arr) {
   arr.reduce (функция (acc, curr) {
      върнете ac + curr
   }, 0
}
// Същата функция, написана в es6
const sum = arr =>
  arr.reduce ((acc, curr) => ac + curr, 0)
const mul = arr =>
  arr.reduce ((acc, curr) => acc * curr, 1)
сума ([1,2,3]) // 6
mul ([2,3,4]) // 24

Нека го разградим
Редукторната функция получава два аргумента:

първи
Функция, тази функция сама получава два аргумента, акумулатор и текуща стойност. Първият от тях съдържа общата стойност, която сме изчислили досега. Вторият, е текущият елемент в нашия масив.

втори
Началната стойност. Акумулаторът ще се инициализира с тази стойност.

Така че сега е лесно да разберем нашата сума функция.
Началната стойност е 0, разбира се, и при всяка итерация връщаме сумата от агрегираната стойност досега и текущия елемент на масива.

Създайте функция на тръбата

Справяне с повече от един аргумент

Както видяхме в нашата тръбна функция, ние се справяме добре с множество аргументи, предадени на първата ни функция.

Ами функцията с множество аргументи, която не е първата функция?
Във функционалния свят има красив дизайн, който ни помага да решим този проблем. Ще го разгледам в друга статия.