La spiegazione che nessuna delle altre risposte fornisce è che gli argomenti originali sono ancora disponibili, ma non nella posizione originale argumentsnell'oggetto.
L' argumentsoggetto contiene un elemento per ciascun parametro effettivo fornito alla funzione. Quando si chiama afornite tre argomenti: i numeri 1, 2e, 3. Quindi, argumentscontiene [1, 2, 3].
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
Quando chiami b, però, passi esattamente un argomento: l a' argumentsoggetto. Quindi argumentscontiene [[1, 2, 3]](cioè un elemento, che è l a' argumentsoggetto, che ha proprietà contenenti gli argomenti originali a a).
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
Come dimostrato da @Nick, è possibile utilizzare applyper fornire un argumentsoggetto set nella chiamata.
Di seguito si ottiene lo stesso risultato:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
Ma applyè la soluzione corretta nel caso generale.
argumentsnon è un array (ma piuttosto un oggetto che implementa una semantica simile ad un array ) e quindi non è del tutto chiaro a prima vista se può essere usato allo stesso modo di un array reale.