Расчет с помощью функции codewars - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь понять, как эти функции вызываются друг в друга.Может ли кто-нибудь рассказать мне, как они бегут?Вызывается ли семь () первым, что в свою очередь вызывает пять ()?

function expression(number, operation){
    if(!operation)
        return number;
    return operation(number);
}

function five(operation) { return expression(5, operation); }
function seven(operation) { return expression(7, operation); }

function times(x) {
    return function(y) {
        return y * x;
    }
}

seven(times(five())); // must return 35

1 Ответ

0 голосов
/ 27 сентября 2019

Я работаю, вызывая функцию изнутри к внешней функции.В качестве иллюстрации, функция и их вызов с параметрами и последующие вызовы.

five()
    expression(5)
        5
times(5) 
    function with closure over x = 5
seven(function)
    expression(7, function)
        function(7)
35

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

Этот подход является реальной реализацией, возможно, позже (или никогда) вы можете использовать фактическую экспериментальную оператор конвейера |>, который имеет следующий синтаксис:

expression |> function

Или с вашими функциями: undefined |> пять |> раз |> семь

function expression(number, operation) {
    console.log('expression');
    if (!operation) return number;
    return operation(number);
}

function five(operation) {
    console.log('five');
    return expression(5, operation);
}

function seven(operation) {
    console.log('seven');
    return expression(7, operation);
}

function times(x) {
    console.log('times');
    return function(y) {
        return y * x;
    }
}

console.log(seven(times(five()))); // 35

console.log([five, times, seven].reduce((value, fn) => fn(value), undefined))
...