A explicação que nenhuma das outras respostas fornece é que os argumentos originais ainda estão disponíveis, mas não na posição original no argumentsobjeto.
O argumentsobjeto contém um elemento para cada parâmetro real fornecido para a função. Quando você liga para avocê fornecer três argumentos: os números 1, 2e,3 . Então, argumentscontém [1, 2, 3].
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
Quando você chama b, no entanto, passa exatamente um argumento: ao argumentsobjeto de. Então argumentscontém [[1, 2, 3]](ou seja, um elemento, que éa o argumentsobjeto de s , que possui propriedades que contêm os argumentos originais para a).
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
Como o @Nick demonstrou, você pode usar applypara fornecer um argumentsobjeto definido na chamada.
O seguinte alcança o mesmo resultado:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
Mas applyé a solução correta no caso geral.
argumentsnão é uma matriz (mas um objeto que implementa a semântica semelhante a uma matriz ) e, portanto, não está totalmente claro à primeira vista se ela pode ser usada da mesma maneira que uma matriz real.