Я попробовал следующее безуспешно:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
В функции a я могу использовать ключевое слово arguments для доступа к массиву аргументов, в функции b они потеряны. Есть ли способ передачи аргументов в другую функцию JavaScript, как я пытаюсь сделать?
javascript
Андерс Нюгаард
источник
источник
arguments
это не на самом деле массив (а скорее объект , который реализует массив типа семантики ) и поэтому не совсем понятно , на первый взгляд , может ли он использоваться таким же образом , как реальный массив может.Ответы:
Используйте,
.apply()
чтобы иметь такой же доступ кarguments
функцииb
, как это:Вы можете проверить это здесь .
источник
var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
apply
этого может привести к искажению области видимостиb
(например, если это какая-то внутренняя функция объекта)Оператор спреда
В ECMAScript ES6 добавлен новый оператор, который позволяет вам сделать это более практичным способом: ... Spread Operator .
Пример без использования
apply
метода:Note Этот фрагмент возвращает синтаксическую ошибку, если ваш браузер все еще использует ES5.
Примечание редактора: так как фрагмент использует
console.log()
, вы должны открыть консоль JS вашего браузера, чтобы увидеть результат - на странице не будет никакого результата.Это покажет этот результат:
Короче говоря, оператор распространения может использоваться для разных целей, если вы используете массивы, поэтому его также можно использовать для аргументов функций, вы можете увидеть похожий пример, объясненный в официальных документах: Параметры отдыха
источник
...args
вa
функции. Вы можете просто создать функцию без аргументов и передать их сb
помощью...arguments
...args
качествеa
ввода может быть важным, если у вас есть вложенные функции.Объяснение, которое не дает ни один из других ответов, состоит в том, что исходные аргументы все еще доступны, но не в исходной позиции в
arguments
объекте.arguments
Объект содержит один элемент для каждого фактического параметра , предоставленного функцией. При вызовеa
вы поставляете три аргумента: числа1
,2
, и,3
. Итак,arguments
содержит[1, 2, 3]
.Когда вы звоните
b
, однако, вы передаете точно один аргумент:a
«sarguments
объект. Таким образом ,arguments
содержит[[1, 2, 3]]
(т.е. один элемент, который являетсяa
«sarguments
объект, который имеет свойство , содержащее исходные аргументыa
).Как продемонстрировал @Nick, вы можете использовать
apply
для предоставленияarguments
объекта set в вызове.Следующее достигает того же результата:
Но
apply
это правильное решение в общем случае.источник
this
кapply
?попробуй это
источник