Foros del Web » Programando para Internet » Javascript »

Ejecutar función cuyo nombre se le pasa como parámetro a otra función

Estas en el tema de Ejecutar función cuyo nombre se le pasa como parámetro a otra función en el foro de Javascript en Foros del Web. Parece un poco enrevesado pero no sé cómo expresarlo mejor. El caso es que necesito que pueda ejecutar una función que no sé el nombre ...
  #1 (permalink)  
Antiguo 25/08/2010, 15:08
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 10 meses
Puntos: 29
Pregunta Ejecutar función cuyo nombre se le pasa como parámetro a otra función

Parece un poco enrevesado pero no sé cómo expresarlo mejor.

El caso es que necesito que pueda ejecutar una función que no sé el nombre de la misma, el cual se le pasa como parámetro. Por ejemplo:
Código Javascript:
Ver original
  1. function cosa(parametro) {
  2.      /*ejecutar función */
  3.      parametro();
  4. }
  5.  
  6. function funcion2() {
  7.      /*se ejecutaría esto en lugar de una función llamada parametro() */
  8. }
  9.  
  10. cosa('funcion2');


Saludos y mil gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #2 (permalink)  
Antiguo 25/08/2010, 15:47
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

se puede hacer, pero depende de las circunstancias. la funcion tiene que ser accesible en forma de metodo de un objeto. es decir, no puede ser una funcion en una variable local de un scope porque entonces no hay forma de invocarla -al menos yo no encuentro la forma-. la clave esta en usar la sintaxis asoaciativa en un objeto.
Código:
// funcion que recibe el nombre de otra funcion;
function fn(name){
return self[name]();
}

// una funcion cualquiera;
function _fn(){
// ...;
}

// invocamos la funcion pasando como parametro el nombre en string;
fn("_fn");
este ejemplo funciona porque las funciones y variables definidas en el ambito global son propiedades del contexto global, en el caso de los navegadores el objeto window.

Código:
// funcion que recibe el nombre de otra funcion;
function fn(name){

// una funcion cualquiera;
function _fn(){
// ...;
}

// como invocar?
return ¿?[name]();
}


// invocamos la funcion pasando como parametro el nombre en string;
fn("_fn");
en este ejemplo fijate que _fn esta definido dentro de fn. sin embargo, ¿como se puede hacer referencia a esa funcion interna usando la forma anterior? en este caso habria que hacer referencia al objeto scope de la funcion fn pero en javascipt no existe forma de referencia un objeto scope. por tanto, no se puede invocar la funcion usando la sintaxis asociativa.

fijate que no es necesario definir la funcion como global, sino que simplemente sea accesible desde un objeto.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 25/08/2010 a las 15:54
  #3 (permalink)  
Antiguo 25/08/2010, 15:51
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 10 meses
Puntos: 29
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

Wow, Wow, Wow!!!! Qué buena explicación! Mil gracias, y me sirvió de mucho (y seguro que a mucha gente más).

Un saludo zerokilled.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #4 (permalink)  
Antiguo 25/08/2010, 16:06
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 18 años
Puntos: 126
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

@zerokilled se me ocurrió ¿y usando la función eval()?
Código Javascript:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. <script type="text/javascript">
  6. function b(id){
  7. alert(document.getElementById(id).value)
  8. }
  9.  
  10. function funcion(a){
  11. eval(a)(a);
  12. }
  13. </script>
  14. </head>
  15. <body>
  16. <form>
  17. <input type="checkbox" id="b" value="1" onclick="funcion(this.id);" />
  18. </form>
  19. </body>
  20. </html>
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #5 (permalink)  
Antiguo 25/08/2010, 18:18
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

@adler,
el ejemplo que expones vendria siendo el equivalente de la sintaxis asociativa, en particular el primer ejemplo que mostre. ahora bien, no tengo claro si a lo que te refieres es a lo que viene a continuacion. algo que recuerdo es que por alguna razon eval tiene acceso al scope de una funcion, de modo que el siguiente ejemplo funciona. siempre habia entendido que eval se ejecuta en el contexto global. en lo personal, no me gusta usar la alternativa de eval y sus pares (setTimeout, setInterval, Function), pero tampoco significa que esta mal. es practicamente el mismo ejemplo tuyo, solo que la funcion esta anidada.
Código:
function fn(name){
function _fn(){
// ...;
}
return eval(name)();
}

fn("_fn");
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 26/08/2010, 04:19
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 10 meses
Puntos: 29
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

Gracias a los dos, las dos son posibilidades según la forma del script que esté haciendo. Me sirvió el post de mucho. Sois unos cracks!

Saludos-
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #7 (permalink)  
Antiguo 26/08/2010, 07:41
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 18 años
Puntos: 126
Respuesta: Ejecutar función cuyo nombre se le pasa como parámetro a otra función

Entiendo, como siempre una explicación muy comprensible

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />

Etiquetas: ejecutar, nombre
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:01.