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