Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как передать arguments вложенной функции?

Нужно сделать функцию, которая принимает две функции (простые мат.операции), объединяет их в одну и возвращает её. Одна из входящих функций может принимать некоторое количество аргументов. А результирующая функция должна иметь возможность принимать аргументы, чтобы направлять их на вход этой вложенной.
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));

Комментариев нет:

Отправить комментарий