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

317
29 декабря 2017, 02:19

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

function funcGen(func1, func2) {
return function(/*возможные аргументы*/) {
    return func1(func2(/*возможные аргументы*/))
}}

Я знаю о псевдомассиве arguments, но не понимаю, как передать его элементы на вход func2. Я бы передал их массивом, но тогда func2 должна быть заранее к этому готова, а такого условия нет в задаче.

Answer 1

Вы, вероятно, хотите что-то такого рода?:

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));

READ ALSO
PhpStorm не знает переменную currentScript — &#171;Unresolved variable currentScript&#187;. Как сделать так, чтобы он знал ее и не выдавал Warning&#39;ов?

PhpStorm не знает переменную currentScript — «Unresolved variable currentScript». Как сделать так, чтобы он знал ее и не выдавал Warning'ов?

PhpStorm не знает переменную currentScript — «Unresolved variable currentScript»Как сделать так, чтобы он знал ее и не выдавал Warning'ов? Вот скриншот:

245
Как JavaScript обрабатывает promise?

Как JavaScript обрабатывает promise?

Шлём запрос, полученный обработчик срабатывает после получения ответа:

270
Рандомная генерация квадратов в canvas

Рандомная генерация квадратов в canvas

Есть функция, которая генерирует квадрат рандомного размера не больше 40px в рандомном месте, не выходя за границы canvas: 1Как сделать минимальный...

277