AlexLearne Ответов: 1

Создайте составить функцию JavaScript


Мне нужна функция, которая составляет другую функцию, а также принимает параметр значения. Например:
var doubleTheValue = function(val) { return val * 2; }
var addOneToTheValue = function(val) { return val + 1; }
compose(5, doubleTheValue, addOneToTheValue)-> 11

Самое главное, что он должен принимать любое количество функций

Что я уже пробовал:

Я знаю, что это может быть возможно найти решение где-то в интернете, но я подошел очень близко, я просто не понимаю, какую ошибку я сделал
function compose(val, fn, fn1) {
var args = [].slice.call(arguments);
  
  for(var i = args.length - 1; i > 0; i--){
    var a = args[i].call(this, args[0])
  }
 return a
}
compose(5, doubleTheValue, addOneToTheValue) -> 10

По какой-то причине он производит 10 игнорируя первый метод, почему?

1 Ответов

Рейтинг:
12

Richard Deeming

Здесь две очевидные проблемы:

1) Вы всегда проходите мимо val к составленным функциям, игнорируя значение, возвращаемое предыдущей составленной функцией.

2) вы вызываете составленные функции в обратном порядке: (5 + 1) * 2 вместо (5 * 2) + 1.

Таким образом, ваш код эквивалентен:

val = 5;
a = addOneToTheValue(val); // = 6
a = doubleTheValue(val);   // = 10
return a;

вместо:
val = 5;
a = val; // = 5
a = doubleTheValue(a);   // = 10
a = addOneToTheValue(a); // = 11
return a;


Попробуйте что-нибудь вроде этого:
function compose(val){
    var result = val;
    
    for (var i = 1; i < arguments.length; i++){
        result = arguments[i].call(this, result);
    }
    
    return result;
}

compose(5, doubleTheValue, addOneToTheValue); -> 11


AlexLearne

Ладно, я понял. Еще раз спасибо!