Передача аргументов в другую функцию javascript

Я пробовал следующее без успеха:

function a(args){
    b(arguments);
}

function b(args){
    // arguments are lost?
}

a(1,2,3);

В функции a я могу использовать ключевое слово arguments для доступа к массиву аргументов, в функции b они теряются. Есть ли способ передать аргументы другой функции javascript, как я пытаюсь сделать?

Ответ 1

Используйте .apply() чтобы иметь одинаковый доступ к arguments в функции b, например:

function a(){
    b.apply(null, arguments);
}
function b(){
   alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);​

Вы можете проверить это здесь.

Ответ 2

Оператор распространения

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

ECMAScript ES6 добавил новый оператор, который позволяет вам сделать это более практичным способом: ... Оператор спреда.

Пример без использования метода apply:

function a(...args){
  b(...args);
  b(6, ...args, 8) // You can even add more elements
}
function b(){
  console.log(arguments)
}

a(1, 2, 3)

Ответ 3

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

Объект arguments содержит один элемент для каждого действительного параметра, предоставляемого функции. Когда вы вызываете a, вы вводите три аргумента: цифры 1, 2 и 3. Итак, arguments содержит [1, 2, 3].

function a(args){
    console.log(arguments) // [1, 2, 3]
    b(arguments);
}

Если вы вызываете b, вы передаете ровно один аргумент: a arguments object. Таким образом, arguments содержит [[1, 2, 3]] (т.е. Один элемент, который является объектом a arguments, который имеет свойства, содержащие исходные аргументы, в a).

function b(args){
    // arguments are lost?
    console.log(arguments) // [[1, 2, 3]]
}

a(1,2,3);

Как показал @Nick, вы можете использовать apply для предоставления в вызове объекта arguments.

Далее достигается тот же результат:

function a(args){
    b(arguments[0], arguments[1], arguments[2]); // three arguments
}

Но apply является правильным решением в общем случае.