He intentado lo siguiente sin éxito:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
En la función a, puedo usar la palabra clave arguments para acceder a un array de argumentos, en la función b estos se pierden. ¿Hay alguna forma de pasar argumentos a otra función javascript como intento hacer?
Usa .apply()
para tener el mismo acceso a arguments
en la función b
, así:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
[Puedes probarlo aquí][2].
El operador spread permite expandir una expresión en lugares donde se esperan múltiples argumentos (para llamadas a funciones) o múltiples elementos (para literales de matrices).
ECMAScript ES6 ha añadido un nuevo operador que permite hacer esto de una forma más práctica: ...Operador de Expansión.
Ejemplo sin usar el método apply
:
-- begin snippet: js hide: false -->
function a(...args){
b(...args);
b(6, ...args, 8) // You can even add more elements
}
function b(){
console.log(arguments)
}
a(1, 2, 3)
Nota Este snippet devuelve un error de sintaxis si tu navegador aún usa ES5.
Nota del editor: Dado que el snippet usa console.log()
, debe abrir la consola JS de su navegador para ver el resultado - no habrá ningún resultado dentro de la página.
Mostrará este resultado:
En resumen, el operador spread puede usarse para diferentes propósitos si usas arrays, así que también puede usarse para argumentos de funciones, puedes ver un ejemplo similar explicado en los docs oficiales: Rest parameters
La explicación que ninguna de las otras respuestas proporciona es que los argumentos originales están todavía disponibles, pero no en la posición original en el objeto arguments
.
El objeto arguments
contiene un elemento por cada parámetro real proporcionado a la función. Cuando llamas a "a", proporcionas tres argumentos: los números "1", "2" y "3". Por lo tanto, arguments
contiene [1, 2, 3]
.
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
Cuando llamas a b
, sin embargo, pasas exactamente un argumento: el objeto arguments
de a
. Así que arguments
contiene [[1, 2, 3]]
(es decir, un elemento, que es el objeto a
's arguments
, que tiene propiedades que contienen los argumentos originales de a
).
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
Como demostró @Nick, puedes usar apply
para proporcionar un conjunto de objetos arguments
en la llamada.
Lo siguiente consigue el mismo resultado:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
Pero apply
es la solución correcta en el caso general.