Нужно сделать функцию, которая принимает две функции (простые мат.операции), объединяет их в одну и возвращает её. Одна из входящих функций может принимать некоторое количество аргументов. А результирующая функция должна иметь возможность принимать аргументы, чтобы направлять их на вход этой вложенной.
function funcGen(func1, func2) {
return function(/*возможные аргументы*/) {
return func1(func2(/*возможные аргументы*/))
}}
Я знаю о псевдомассиве arguments, но не понимаю, как передать его элементы на вход func2. Я бы передал их массивом, но тогда func2 должна быть заранее к этому готова, а такого условия нет в задаче.
Ответ
Вы, вероятно, хотите что-то такого рода?:
function pow2(a) {
return a * a;
}
function sum() {
var sum = 0;
for (var i = 0; i < arguments.length; ++i) {
sum += arguments[i];
}
return sum;
}
function collapseFunctions(f1, f2) {
return function() {
return f1(f2.apply(this, arguments));
}
}
console.log(collapseFunctions(pow2, sum)(1, 2, 3));
Функция f1 принимает 1 параметр, я сделал функцию, которая принимает 1 аргумент и возводит его в квадрат - pow2.
Функция f2 принимает любое количество параметров, в данном случае я сделал функцию, которая считает сумму всех переданных параметров.
Функция collapseFunctions принимает f1 и f2, вызывает f2 и передает результат ее работы как аргумент для f1. Потом все, что насчитала f1, возвращается вам.
Для анонимной функции внутри collapseFunction я не объявлял параметры, ибо они берутся из arguments. Чтобы пробросить псевдомассив arguments в функцию f2, я использую функцию apply.
Как-то так. Надеюсь, что понял, что вы хотите.
ДОПОЛНЕНИЕ
Функция f2 в моем примере не обязательно должна работать с псевдомассивом arguments. Она может явно объявлять нужные ей параметры. Они будут доставлены ей в любом случае. Например, пусть берет лишь два параметра - a и b
function pow2(a) {
return a * a;
}
function sum(a, b) {
return a + b;
}
function collapseFunctions(f1, f2) {
return function() {
return f1(f2.apply(this, arguments));
}
}
console.log(collapseFunctions(pow2, sum)(1, 2));
Комментариев нет:
Отправить комментарий