Как передать все аргументы в виде коллекции другой функции, а не как один аргумент?
У меня есть функция, которая принимает любые числа и виды аргументов, поэтому определенный параметр не определен. Эта функция должна вызывать другую функцию, передающую все аргументы.
Проблема в том, что я могу передать "аргументы", чтобы включить все аргументы, но в этом случае он будет работать как один аргумент, а не то, как мы ожидаем, что аргументы будут работать.
Пример:
Основная функция:
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);
}