Javascript: переадресация вызовов функций, которые принимают переменное количество аргументов

Мне кажется, мне нужно что-то вроде ruby ​​splat * здесь.

function foo() {
  var result = '';
  for (var i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
}

function bar() {
  return foo(arguments) // this line doesn't work as I expect
}

bar(1, 2, 3);

Я хочу, чтобы это возвращало "123", но вместо этого я получаю "[object Arguments]". Кажется, это имеет смысл. Он передает объект, который представляет аргументы, но не аргументы индивидуально.

Итак, как я просто пересылаю любое количество аргументов другой функции, которая принимает любое количество аргументов?

Ответ 1

ОБНОВЛЕНИЕ: Начиная с ES6, вы можете использовать расширенный синтаксис для вызова функции, применяя элементы итерируемого объекта в качестве значений аргумента вызова функции:

function bar() {
  return foo(...arguments);
}

Обратите внимание, что вы также можете получать переменное число аргументов в виде реального массива вместо использования объекта arguments.

Например:

function sum(...args) { //  args is an array
  return args.reduce((total, num) => total + num)
}

function bar(...args) {
  return sum(...args) // this just forwards the call spreading the argument values
}

console.log(bar(1, 2, 3)); // 6

Ответ 2

Попробуйте return foo.apply(this,arguments). Также вы можете использовать Array.prototype.slice.apply(arguments).join('') для вашей функции foo.