Codewars Solution - Функции, действующие друг на друга, вложены [закрыто]

11

Я искал решение головоломки на CodeWars, и я не понимаю, почему это работает. Как работает минус ()?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5

TypeleveN
источник
Вот похожий вопрос с немного другим подходом, который может помочь пролить некоторый свет на то, как это работает
Ник Парсонс
1
Я проголосовал за то, чтобы закрыть это после того, как провалил его как ревизионный аудит: для меня не было очевидным, что вы не поняли об этом. Будет лучше, если отредактировано, чтобы объяснить, почему вы думали, что минус не должен работать.
GS - извиниться перед Моникой

Ответы:

8

Это немного сложно. :-)

console.log(eight(minus(three()))); запускается изнутри, так что давайте пройдем через это:

  • three()- звонит makeNum(3, undefined)и возвращает то, что возвращает. makeNum(3, undefined)возвращает 3, так что это возвращаемое значение.
  • minus(3)- звонки minus, проходящие в 3качестве right. minusвозвращает новую функцию , которая закрывает более right.
  • eight(...)- вызывает makeNum(8, fnFromMinus)где fnFromMinusфункция, которая была возвращена minus(3). makeNum(8, fnFromMinus)делает fnFromMinus, передавая 8как left. fnFromMinusвозвращает результат left - right(помните , что rightэто 3, fnFromMinusсомкнулась над ним).

Поскольку 8 - 3есть 5, конечный результат 5, который console.logвозвращается.

Вот инструментальная версия:

TJ Crowder
источник
2

Это на самом деле не так сложно, если вы работаете через это шаг за шагом. Давайте работать изнутри. Вызов:

three()

без параметра означает, что вы передаете неопределенное значение как func. Это то же самое, что сказать:

makeNum(3, undefined)

Когда makeNum видит, что func не определен, он возвращает num, что равно 3.

Итак, мы сократили это до:

eight(minus(3))

Теперь посмотрим как

minus(3)

оценивает. Минус видит, что заданный вами параметр равен 3, поэтому он возвращает функцию, которая может принять «левый» параметр и вычесть 3, которые мы уже предоставили из него. Это НЕ выполняет. Он просто сидит там, ожидая вызова с «левым» параметром, чтобы вычесть из него 3.

Итак, мы сократили это до:

eight(function(left){
    return left - 3;
})

Теперь посмотрим, как это оценивается. восьмерка вызывается с параметром func, являющимся этой функцией:

function(left){
    return left - 3;
}

Затем он передает 8 и эту функцию makeNum, когда он говорит:

makeNum(8, func)

Затем makeNum видит, что func был предоставлен (и поэтому не определен), и возвращает func (num) обратно в восьмую функцию, что аналогично передаче:

8 - 3

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

5

который регистрируется в консоли.

Аарон Плочарчик
источник
0

minusвозвращает новую функцию для каждого вызова с параметрами, передаваемыми ей Когда возвращаемая функция вызывается, она может ссылаться на параметры, переданные при вызове, в дополнение к любым параметрам, переданным ей. Это один из способов карри функций в JavaScript.

отметка
источник
0

Этот код является примером функций высшего порядка в функциональных языках программирования, таких как js. Функции Javascript рассматриваются как объекты, и их тоже можно передавать и возвращать.

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

minusвозвращает анонимную ( функцию без определенного имени ) функцию в основном как:

function(left) {
        return left - 3; //right = 3
    };

Эта функция при eightвызове вызывается как, func(8)которая затем дает результат как5

bUff23
источник
0

Еще один способ взглянуть на это - вы можете переписать эту строку:

console.log(eight(minus(three())));

В виде:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
Андреа Корбеллини
источник