Как передать все аргументы в виде коллекции другой функции, а не как один аргумент?

У меня есть функция, которая принимает любые числа и виды аргументов, поэтому определенный параметр не определен. Эта функция должна вызывать другую функцию, передающую все аргументы.

Проблема в том, что я могу передать "аргументы", чтобы включить все аргументы, но в этом случае он будет работать как один аргумент, а не то, как мы ожидаем, что аргументы будут работать.

Пример:

Основная функция:

function handleCall() {
   // let call a sub-function
   // and pass all arguments (my question is how this is handled the right way)
   function callSubFunction( arguments );
}

function callSubfunction( userid, customerid, param) {
   // passed arguments are now 
   alert( 'userid = ' + userid );

   // this will not work, you have to use arguments[2]
   alert( param );
  }

The example call:

handleCall( 1029, 232, 'param01' );

Используя вышеприведенный подход, все аргументы будут храниться в "userid" в виде псевдо-массива, и элементы могут быть доступны, например. аргументы [2], но не используя имя параметра "param".

В ColdFusion решение для такого материала является параметром "argumentCollection", таким образом вы можете передавать параметры, хранящиеся в структуре, без преобразования в один аргумент с структурой типа, содержащей все ключи/значения.

Как я могу достичь того же с JavaScript?

Ответы

Ответ 1

Вы можете использовать метод .apply() для вызова функции и передачи аргументов в виде набора.

callSubFunction.apply( this, arguments ); 

Первый аргумент установит значение this в методе allSubFunction. Я просто установил его в текущее значение this. Второй - это набор аргументов для отправки.

Итак, ваша функция handleCall() будет выглядеть так:

function handleCall() {
     //set the value of "this" and pass on the arguments object
    callSubFunction.apply( this, arguments );
}

Не требуется отправлять объект Arguments. Вы можете отправить аргументы Array, если это необходимо.

Ответ 2

Если вы хотите сделать то же самое с синтаксисом , вы можете использовать следующее:

function handleCall(...args) {
    callSubFunction(...args);
}

Ответ 3

Используйте так:

function Foo()
{
    Bar.apply(this, arguments);
}

function Bar(a, b)
{
    alert(a);
    alert(b);
}