Объясните, пожалуйста, что здесь происходит
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
Ответы (1 шт):
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. код такой, что сам чёрт ногу сломит.