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 arguments
objeto.
O arguments
objeto contém um elemento para cada parâmetro real fornecido para a função. Quando você liga para a
você fornecer três argumentos: os números 1
, 2
e,3
. Então, arguments
conté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: a
o arguments
objeto de. Então arguments
contém [[1, 2, 3]]
(ou seja, um elemento, que éa
o arguments
objeto 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 apply
para fornecer um arguments
objeto 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.
arguments
nã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.