Передача переменной количества аргументов из одной функции в другую

Возможный дубликат:
Можно ли отправить переменное количество аргументов функции JavaScript?

Я могу использовать arguments, чтобы получить переменное количество аргументов внутри функции, но как передать их другой функции, не зная ее прототипа?

function show(foo, bar) { window.alert(foo+' '+bar); }
function run(f) { f(arguments); } // not correct, what to do?
run(show, 'foo', 'bar');

Примечание. Я не могу гарантировать количество аргументов, необходимых для функции f, которая передается в run. Смысл, хотя приведенный пример имеет 2 аргумента, он может быть 0-бесконечным, поэтому следующий не соответствует:

function run(f) { f(arguments[1], arguments[2]); }

Ответ 1

Основной способ передать программно сгенерированный набор аргументов функции - это использовать метод 'apply'.

function show(foo, bar) {
  window.alert(foo+' '+bar);
}
function run(f) {
  // use splice to get all the arguments after 'f'
  var args = Array.prototype.splice.call(arguments, 1);
  f.apply(null, args);
}

run(show, 'foo', 'bar');

Ответ 2

Вы можете на самом деле сделать это с помощью приложения, если я правильно понял ваш вопрос:

function show(foo, bar) { window.alert(foo+' '+bar); }
function run(f, args) { f.apply(null,args); } 
run(show, ['foo', 'bar']);

Ответ 3

вам нужно использовать функцию apply. Вот как это сделать:

function variableFunction1()  
    {  

   alert("variableFunction1 arguments length: " + arguments.length);  

   // calls second varargs function keeping current 'this'.  
   variableFunction2.apply(this, arguments);  
}  

function variableFunction2()  
{  

   alert("variableFunction2 arguments length: " + arguments.length);  
}  

variableFunction1('a','b','c');  

Демо

Ответ 4

В вашем примере передать переменные аргументы, чтобы показать, что это работает

function show(foo, bar) { window.alert(foo+' '+bar); }
function run(f) { f.apply(null, Array().slice.call(arguments, 1)); }
run(show, 'foo', 'bar');