Объясните, пожалуйста, что здесь происходит

Рейтинг: 1Ответов: 1Опубликовано: 22.03.2023
const getNumber = x => (f = x => x) => f(x);
const setOperator = f => y => x => f(x, y);

const five = getNumber(5);
const plus = setOperator((x, y) => x+y);
const minus = setOperator((x, y) => x-y);

console.log(five(plus(five()))); //10

Ответы

▲ 0

getNumber - функция, в первый аргумент предполагается число (аргумент x), сама функция возвращает другую функцию, которая и возвращает аргумент, написанный вами в аргументах функции.

Пример:

const getNumber = x => (f = x => x) => f(x);

const функция_возвращающая_число_42 = getNumber(42)

const число_42 = функция_возвращающая_число_42()

console.log(число_42)

setOperator - функция, принимающая в аргумент другую функцию (аргумент f), сама функция setOperator возвращает ещё одну функцию в первый аргумент, который вписывается число y. А сама эта функция (та которая принимает число y), возвращает ещё одну анонимную функцию, в которую в свою очередь вписывается число x, уже при вызове этой функции (принимающей число x), вызывается та самая функция f которую мы написали в аргументы setOperator в самом начале.

Пример:

const setOperator = f => y => x => f(x, y);

const функция_принимающая_y = setOperator((x, y) => x + y)
const функция_принимающая_x = функция_принимающая_y(2)
const результат_сложения_x_и_y = функция_принимающая_x(2)

console.log(результат_сложения_x_и_y)

Если, разбирать код на части, то получится вот такая вот каша:

const получить_функцию_возвращающую_первый_аргумент /* getNumber */ = x => (f = x => x) => f(x);

const получить_функцию_возвращающую_анон_функцию_принимающую_y /* setOperator */ = f => y => x => f(x, y);

const функция_возвращающая_число_5 /* five */ = получить_функцию_возвращающую_первый_аргумент(5);

const функция_принимающая_y /* plus */ = получить_функцию_возвращающую_анон_функцию_принимающую_y((x, y) => x + y);

const функция_принимающая_x_у_которой_y_равен_5 /* plus(five()) */ = функция_принимающая_y(функция_возвращающая_число_5())

const результат_сложения_x_и_y /* five(plus(five())) */ = функция_принимающая_x_у_которой_y_равен_5(функция_возвращающая_число_5())

console.log(результат_сложения_x_и_y)

P.S. код такой, что сам чёрт ногу сломит.