Састав функције у ЈаваСцрипт-у

Састав функције је тачкаста примена једне функције на резултат друге. Програмери то раде ручно сваки дан када гнездо функционише:

compose = (fn1, fn2) => value => fn2(fn1(value))

Али ово је тешко прочитати. Постоји бољи начин коришћења функције функције. Уместо да их читате изнутра:

add2AndSquare = (n) => square(add2(n))

Можемо да користимо функцију вишег реда да бисмо их повезали на уређен начин.

add2AndSquare = compose( add2, square)

Једноставна примена састављања била би:

compose = (f1, f2) => value => f2( f1(value) );

Да бисмо добили још већу флексибилност, можемо користити функцију редуцеРигхт:

compose = (...fns) => (initialVal) => fns.reduceRight((val, fn) => fn(val), initialVal);

Читање композиције с лева на десно омогућава јасно уланчавање функција вишег реда. Примери из стварног света су додавање својстава за потврду идентитета, евидентирање и контекст. То је техника која омогућава поновну употребу на највишем нивоу. Ево неколико примера како се користи:

// example const add2 = (n) => n + 2; const times2 = (n) => n * 2; const times2add2 = compose(add2, times2); const add6 = compose(add2, add2, add2); times2add2(2); // 6 add2tiems2(2); // 8 add6(2); // 8

Можда мислите да је ово напредно функционално програмирање и да није релевантно за фронтенд програмирање. Али корисно је и у апликацијама са једном страницом. На пример, можете додати понашање компоненти Реацт користећи компоненте вишег реда:

function logProps(InputComponent) { InputComponent.prototype.componentWillReceiveProps = function(nextProps) { console.log('Current props: ', this.props); console.log('Next props: ', nextProps); }; return InputComponent; } // EnhancedComponent will log whenever props are received const EnhancedComponent = logProps(InputComponent);

У закључку, састав функције омогућава поновну употребу функционалности на врло високом нивоу. Ако су функције добро структуриране, омогућава програмерима да креирају ново понашање на основу постојећег понашања.

Такође повећава читљивост имплементација. Уместо гнежђења функција, можете јасно повезати функције и створити функције вишег реда са смисленим именима.