Pasar funcion como parametro

El otro día estaba intentando hacer una función en actionscript que me llamara a otra función después de una pausa aleatoria. Dado que pensaba utilizarla para varias cosas distintas dentro del mismo programa, la llamada a la segunda función debía ser un parámetro, al estilo de setInterval (no utilicé éste por diversas razones). La llamada a la función sería tal que así:


pausaAleatoria(funcionLlamada, valorMin, valorMax);

Entonces me topé con un problema que me ha surgido muchas veces y hasta ahora no había podido resolver: ¿Cómo ejecuto la función cuyo nombre he pasado como parámetro dentro de la otra? Dado que es lo que hace precisamente setInterval, resulta lógico que sea posible hacerlo…

La manera más obvia de hacerlo me parecía pasarle el nombre de la función como string y hacer varios tipos de eval (eval("funcionLlamada" + ()), eval ("funcionLlamada()") así que probé muchas cosas en esta línea, pero nada funcionaba. Varias búsquedas por la web también resultaron infructuosas.

Ahora que por fin me han dado la solución (gracias, natalia) resulta, como casi todo una vez q lo sabes, ridículamente sencillo. No hay que hacer ningún eval ni prestidigitación de ningún tipo. Un ejemplo:


// esta es una función cualquiera
function a () {
  trace ("soy la funcion a");
}
// y desde otra función vamos a llamar a la primera
function b (funcionLlamada) {
  trace ("soy la funcion b");
  funcionLlamada();
}
// y lo ejecutamos tal que así.
b(a);
// en la ventana de trace aparecerá
// soy la funcion b
// soy la funcion a

La clave (que yo no alcanzaba a ver) está en que los paréntesis que ponemos después de una función son un operador y no un simbolo arbitrario. Igual que el signo + entre dos valores significa “suma esto”, el operador () significa “ejecuta esto”

Quizás este problema solo lo haya tenido yo por mi idiosincrática manera de programar, pero aquí lo dejo como referencia para mi y todo el que lo quiera. Seguro que alguna vez a alguien le sirve.

Nota: El tema de pasarle parámetros es igual de facil si conocemos a priori el número de parámetros que queremos pasarle. Basta con ponerlos dentro del operador (); pero dado que lo que quería era una función genérica, esto no me sirve . Si consigo (o alguien me cuenta) la solución para pasarle un número indeterminado de parámetros, también la pongo por aquí, no sea que se me vuelva a olvidar. Buenas tardes.

tags:No tags

9 Responses to “Pasar funcion como parametro”

  1. Miguel García Says:

    Yo había resuelto el tema de las funciones como parámetro con el eval también, en plan prestidigitador después de haber probado mil cosas. No se me había ocurrido lo de ponerle los () directamente a la variable.

    El problema es que tal y como lo planteas tú no sirve con parámetros (o al menos a mí no me funciona), así que me veo obligado a seguir con el prestidigitado eval de la siguiente manera:

    funcion = “getURL”;
    param1 = “http:\loquesea.com”;
    param2 = “_blank”;
    eval(funcion)(param1,param2);

    Ya que como decía antes, hacer: funcion(param1,param2); no me tira.

    En cuanto a lo del número indeterminado de parámetros, tengo el mismo problema que tú, ya que no puedo “componer” la lista de parámetros dinámicamente. Yo de momento me lo he currado de la siguiente manera, aunque es un poco fea y bastante tediosa. Meto todos los parámetros en un array “params” y luego hago un switch con la longitud del array de la siguiente manera:

    switch(params.length)
    {
    case 0:
    eval(funcion)(); // este sí funcionaría como funcion();
    break;
    case 1:
    eval(funcion)(params[0]);
    break;
    case 2:
    eval(funcion)(params[0],params[1]);
    brak;
    }

    Eso valdría hasta 2 parámetros. Si lo quieres para más, tendrás que continuar el switch.

    Un saludo,

    Miguel García

  2. jesus gollonet Says:

    buenas, miguel. ante todo disculpa que tu comentario no saliera. tenía esto un poco abandonado y no había visto que estaba pendiente de moderación.

    respecto a lo que comentas, te diré que a mi si me funciona pasarle parámetros si sé de antemano cuántos quiero pasarle. copiando el ejemplo que puse:

    // esta es una función cualquiera
    function a (parametro) {
    trace (”soy la funcion a y mi parametro se llama ” + parametro);
    }
    // y desde otra función vamos a llamar a la primera
    function b (funcionLlamada, parametro) {
    trace (”soy la funcion b”);
    funcionLlamada(parametro);
    }
    // y lo ejecutamos tal que así.
    b(a, “miguel”);
    // en la ventana de trace aparecerá
    // soy la funcion b
    // soy la funcion a y mi parametro se llama miguel

    sin embargo sigo con el mismo problema. si no se el número de parámetros a priori, no me sirve esta solución. Ya que me lo has recordado, me lo voy a mirar a ver si lo saco.

    Saludos y gracias por el comentario

  3. Miguel García Says:

    Ok. La diferencia entre tu ejemplo y el mío y por la que no necesitas usar eval es porque tú no estás pasando el nombre de la función como un string, mientras que yo sí.

    Si en mi ejemplo le hubiera quitado las comillas al getURL ya funciona sin el eval tal que así:

    funcion = getURL;
    param1 = “http:\loquesea.com”;
    param2 = “_blank”;
    funcion(param1,param2);

    Pues nada… De momento me temo que tendremos que apañarnos con la solución del switch a falta de algo mejor. La cosa sería currárselo y ampliarlo a una porrada de parámetros. A mí para la mayoría de los casos me vale con 2, pero la solución valdría para un número grande(finito) de parámetros desconociendo a priori cuántos son.

    Saludos,

    Miguel García

  4. javier Says:

    Hola:
    No soy ningún experto en flash pero se me ocurre que pueden pasarse una cantidad indeterminada de parametros a una función pasandole como parámetro un array.
    El problema es que no sé si esto es posible ya que se me ha dado el caso de necesitar pasar un array como parametro y no he sabido hacerlo.
    Si alguien puede ayudarme le quedaré agradecido.

  5. jesus gollonet Says:

    Hola, javier.

    Por si te sigue interesando el tema, ya encontré la solución.
    Lo que comentas del array es perfectamente posible, pero creo que la solución “canónica” se parecería más a esto

    http://www.jesusgollonet.com/blog/index.php?p=52

    Saludos

  6. Tulio Says:

    Hola, respondiendo el interrogante de como hacer una funcion que reciba cualquier numero de parametros, en javascript todas las funciones tienen un objeto asociado que es nombreFuncion.arguments por medio de este se puede acceder a los parametros.
    A la hora de definir la funcion simplemete se define como una funcion sin parametros y dentro se recorre la variable arguments

  7. Mario Says:

    Yo tengo un problemita talvez un poco mas raro, ya puedo pasar una funcion como parametro (yo lo estoy haciendo javascript, auqnue la verdad es muy muy similar a actionscript) … como les decia, lo que quiero hacer es pasar una funcion que ya lleva parametros y luego dentro de la otra funcion ponerle otros parametros mas :d jaja creo que esta un poco loco … pero talvez alguien puede ayudarme.

  8. acidbjazz Says:

    es facil, lo q llega a una funcion YA es un array, llamado arguments.. con algo como esto (si envian el nombre de la funcion primero) podrian seprarar la funcion de sus parametros:

    nuevosParametros = arguments.splice(1, (arguments.length - 3));

    (el valor -3, es porq tengo una funcion tipo :
    function G(funcion, param1, …,paramN, paramDeG_1, paramDeG_2)

    Luego para volver a asignarles los parametros a la funcion:

    funcion.apply(null, nuevosParametros);

  9. acidbjazz Says:

    editalo, es -3, no -4 =P

Leave a Reply