Объяснение, которое не дает ни один из других ответов, состоит в том, что исходные аргументы все еще доступны, но не в исходной позиции в argumentsобъекте.
argumentsОбъект содержит один элемент для каждого фактического параметра , предоставленного функцией. При вызове aвы поставляете три аргумента: числа 1, 2, и, 3. Итак, argumentsсодержит [1, 2, 3].
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
Когда вы звоните b, однако, вы передаете точно один аргумент: a«s argumentsобъект. Таким образом , argumentsсодержит [[1, 2, 3]](т.е. один элемент, который является a«s argumentsобъект, который имеет свойство , содержащее исходные аргументы a).
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
Как продемонстрировал @Nick, вы можете использовать applyдля предоставления argumentsобъекта set в вызове.
Следующее достигает того же результата:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
Но applyэто правильное решение в общем случае.
argumentsэто не на самом деле массив (а скорее объект , который реализует массив типа семантики ) и поэтому не совсем понятно , на первый взгляд , может ли он использоваться таким же образом , как реальный массив может.