javascript - tipos - Función de llamada con matriz de argumentos
pasar parametros a una funcion javascript desde html (2)
Esta pregunta ya tiene una respuesta aquí:
¿Puedo llamar a una función con una variedad de argumentos de una manera conveniente en JavaScript?
Ejemplo:
var fn = function() {
console.log(arguments);
}
var args = [1,2,3];
fn(args);
Necesito que los arguments
sean [1,2,3]
, al igual que mi matriz.
Debes utilizar apply
:
var fn = function() {
console.log(arguments);
};
var args = [1,2,3];
fn.apply(null, args);
Aplicar hará la llamada de función equivalente:
fn(1,2,3);
Tenga en cuenta que usé null
como el primer argumento de apply
, que establecerá this
palabra clave en el objeto global ( window
) dentro de fn
.
Además, debe saber que el objeto de arguments
no es realmente una matriz, es un objeto de tipo matriz, que contiene índices numéricos correspondientes a los argumentos que se utilizaron para llamar a su función, una propiedad de length
que le proporciona el número de argumentos utilizados, y la propiedad arguments.callee
que es una referencia a la función de ejecución (útil para la recursión en funciones anónimas).
Si desea crear una matriz a partir de su objeto de arguments
, puede usar el método Array.prototype.slice
:
var fn = function() {
var args = Array.prototype.slice.call(arguments);
console.log(args);
};
Edición: en respuesta a su comentario, sí, podría usar el método de shift
y establecer su valor devuelto como el contexto (la palabra clave) en su función:
fn.apply(args.shift(), args);
Pero recuerde que shift
eliminará el primer elemento de la matriz original, y se llamará a su función sin ese primer argumento.
Si aún necesita llamar a su función con todos sus otros argumentos, puede:
fn.apply(args[0], args);
Y si no desea cambiar el contexto, simplemente puede extraer el primer argumento dentro de su función:
var fn = function() {
var args = Array.prototype.slice.call(arguments),
firstArg = args.shift();
console.log(args, firstArg);
};
En ECMAScript 6, puede usar la sintaxis de propagación ( ...
) para ese propósito. Es mucho más simple y fácil de entender que Function.prototype.apply()
.
Ejemplo de código:
const fn = function() {
console.log(arguments);
}
const args = [1,2,3];
fn(...args);