Pasar funcion como parametro. 2: Multiples parametros.

En una entrada anterior comentaba cómo pasar el nombre de una función a otra como parámetro. Sin embargo, no sabía cómo pasarle un número indeterminado de parámetros a la función llamada. Tras varios intentos fallidos, lo dejé en el tintero. Hoy, buscando otra cosa, he encontrado lo que me quedaba para solucionarlo en otro blog. Me explico:

Cada vez que llamamos una función, de forma predefinida se crea dentro de esta un array de nombre arguments, que almacena todos los parámetros pasados.


function a(param1, param2, param3) {
  trace(arguments);
}
a ("pepe", "juan", "jorge");
// la ventana de salida muestra : pepe, juan, jorge
// * ya lo se, qué parametros mas aburridos *

Dado que arguments es un array, podemos hacer todas las operaciones de esta clase con ella. Por ejemplo:


function a(param1, param2, param3) {
  trace(arguments.length);
}
a ("pepe", "juan", "jorge");
// la ventana de salida muestra : 3

La idea era pasar el array de parámetros de una funcion a la segunda, pero ahí me quedé. No había manera de concatenar los parámetros para pasarlos a la función de dentro. Pero… hoy me he encontrado con esto:

Using an array as a list of arguments

Tenía toda la pinta de ser lo que andaba buscando. Y en efecto:

Si utilizo el método function.apply() puedo pasar un array como lista de argumentos.


// array de parametros
d_arr = ["un", "dos"]

function c (arg1, arg2) {
	trace ( arg1+ ", "+arg2);
}
// uso el método function.apply() pasándole el nombre de la matriz
// como parámetro. *el otro parámetro no nos sirve aquí, por eso paso null.
c.apply(null, d_arr);

Juntando todo esto, pues, tenemos la solución definitiva para pasar cualquier función (tenga parámetros o no) como parámetro de otra:


// función genérica que llamará a cualquier función con cualquier número de parámetros
function a(func, args) {
	// eliminamos el primer elemento del array arguments.
	newArguments = arguments.splice(1, arguments.length);
	// y llamamos a la función desde dentro con function.apply()
	// pasándole el nuevo array arguments como parámetro.
	func.apply(null, newArguments);
}
// función cualquiera, sosa.
function b(arg1, arg2, arg3) {
	// trace de los de toda la vida con 3 parámetros
	trace("Vaya post "+arg1+" "+arg2+" "+arg3);
}
// llamada
a(b, "más", "mal", "explicado.");
// la ventana de salida mostrará "Vaya post más mal explicado"

Y eso es todo. Así no se me olvida.

tags:No tags

4 Responses to “Pasar funcion como parametro. 2: Multiples parametros.”

  1. Miguel García Says:

    Qué chachi. Gracias por la info, Jesús. El “apply” este es lo que siempre había estado buscando yo también jeje. Nos emperrábamos en usar “eval” y como que no… Y estaba ahí, delante de nuestras narices todo el tiempo en la clase Function…

    Pues nada eso, que gracias por avisarme del post personalmente por mail y saludos a todos los que lean tu blog.

  2. jesus gollonet Says:

    Jeje, atención personalizada, lo llaman.

    Es broma. Te avisé xq vi que había interés (y para mi fue como una epifanía encontrar por fin la solución).

    Saludos, caballero.

  3. Jesús Says:

    ¿Que te parece como solución pasarle un objeto como argumento cuyos atributos sean los parámetros?

    Del estilo:

    function a (param:Object){
    for(var nam in param)
    trace(nam+” : “+param[nam])
    }

    a({nombre:”yo”,id:”miId”})

    El único problema es que identificas el parámetro con un nombre (que tienes que recordar a la hora de hacer la llamada a la funcion).
    Pero te permite que la función trabaje con un número indefinido de parámetros que no tienen porque seguir un orden en concreto.

    (Bueno esto es la eterna duda Array indexado VS “Array” asociativo)

    PD:Me imagino que con el tiempo que ha pasado desde el último post ya no revisarás mucho esto pero ahún asi agradecerte la ayuda que brindas en tus publicaciones.

    Un saludo

  4. jesús gollonet Says:

    Es curioso. Precisamente hace unos días (a raiz de empezar a usar el excelentísimo Fuse) he comenzado a usar esa técnica y me encanta. Ciertamente pierdes strict typing, pero ganas una flexiblidad increíble.

    Saludos. Jesús.

Leave a Reply