Ответ 1
Используйте .apply()
чтобы иметь одинаковый доступ к arguments
в функции b
, например:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
Я пробовал следующее без успеха:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
В функции a я могу использовать ключевое слово arguments для доступа к массиву аргументов, в функции b они теряются. Есть ли способ передать аргументы другой функции javascript, как я пытаюсь сделать?
Используйте .apply()
чтобы иметь одинаковый доступ к arguments
в функции b
, например:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
Оператор спрединга позволяет расширять выражение в местах, где ожидаются множественные аргументы (для вызовов функций) или несколько элементов (для литералов массива).
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)
Объяснение того, что ни один из других ответов не содержит, что исходные аргументы все еще доступны, но не в исходной позиции в объекте 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
является правильным решением в общем случае.