Foros del Web » Programando para Internet » Javascript »

Una funcion que ejecute a otra pasada por parametro

Estas en el tema de Una funcion que ejecute a otra pasada por parametro en el foro de Javascript en Foros del Web. Hola, tengo un problema muy enrevesado... El objetivo es hacer que una funcion ejecute a otra, que ha sido pasada por parametro. Ahora bien, tengo ...
  #1 (permalink)  
Antiguo 22/08/2005, 10:09
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Una funcion que ejecute a otra pasada por parametro

Hola, tengo un problema muy enrevesado...

El objetivo es hacer que una funcion ejecute a otra, que ha sido pasada por parametro. Ahora bien, tengo dos maneras de pasar por parametro una funcion:

Código PHP:
function ejecutador(func) {
    eval(
func);
}

function 
ejecutador2(f) {
    eval(
f+"()");
}

function 
ejecutada(x,y) {
    
alert("Paso por aqui");
    
document.write(x+" multiplicado por "+y+" es igual a "+(x*y)+"<br>");
}

ejecutador(ejecutada);
ejecutador2("ejecutada"); 
Tengo estas dos maneras de pasarlo por argumento. La manera 2 (a la que hace referencia ejecutador2) es la que me funciona. Se pasa como String el nombre de la variable, y se ejecuta con ese eval.

La manera 1 (la que intento con ejecutador1) no me funciona. Es pasar la funcion como nombre. Todos sabemos que esto es lo mismo que escribir una funcion entera en un String, y ponerla en ejecutador1 como argumento.

¿como ejecuto la funcion de manera 1?

No me digais que transformandolo a manera2 (quiero decir, extraer del string completo de la funcion su nombre, y llamarlo con ejecutador2). ¿Se puede?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 23/08/2005, 10:53
 
Fecha de Ingreso: julio-2005
Mensajes: 90
Antigüedad: 18 años, 9 meses
Puntos: 1
joder que lio
  #3 (permalink)  
Antiguo 23/08/2005, 11:32
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
La pregunta se centra en: ¿Como ejecutar la funcion de dentro de str?
Código PHP:
var str="function mi_func() {";
str+="var a=3;";
str+="var b=4;";
str+="return a*b;"
str+="}"
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 10/09/2005, 11:05
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Probé creando un elemento script y añadiéndolo:

Código:
<html>
<body>
<script>
var str="function mi_func() {"; 
str+="var a=3;"; 
str+="var b=4;"; 
str+="return a*b;" 
str+="}";
var scrNuevo = document.createElement("script");
scrNuevo.innerHTML = str;
document.body.appendChild(scrNuevo);
alert(mi_func());
</script>
</body>
</html>
En FF funcionó pero en explorer no.

Luego haré más pruebas, pero me imagino que escribiendo en un iframe o algo así... En mi probador de script hago algo parecido...

Este es el enlace: http://www.pepemolina.com/probador/index.html

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 10/09/2005, 11:58
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Siempre podriamos hacer una variacion del flujo, osea, una chapuzilla asi:

Código PHP:
<html>
<
body>
<
script>
    var 
str="function mi_func() {"
    
str+="var a=3;"
    
str+="var b=4;"
    
str+="return a*b;" 
    
str+="}";
    if(
document.all) {
        eval(
str);
        
alertwindow["mi_func"]() );
    }
    else {
        var 
scrNuevo document.createElement("script");
        
scrNuevo.innerHTML str;
        
document.body.appendChild(scrNuevo);
        
alert(mi_func());
    }
</script>
</body>
</html> 
Pero bueno, a ver si conseguimos una solucion global...

Gracias !


*EDITO:
Bueno, tambien puede valer:
Código PHP:
document.write("<scr"+"ipt>"+str+"</scr"+"ipt>"); 
Pero claro, no es dinamico, y no me valdria para ejecutar acciones una vez la pagina este cargada.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.

Última edición por derkenuke; 10/09/2005 a las 12:13
  #6 (permalink)  
Antiguo 11/09/2005, 14:39
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 19 años, 8 meses
Puntos: 5
Hola derkenuke y compañía.

Para que una función pueda ejecutar a otra pasándola como parámetros sólo debes enviar el nombre de la función y los argumentos que esta necesita, sería así :

Código:
<script language="JavaScript" type="text/javascript">
<!--
function ejecutador(func,x,y) {
func(x,y);
}

function ejecutador2(f) {
eval(f+"()");
}

function ejecutada(x,y) {
alert("Paso por aqui");
document.write(x+" multiplicado por "+y+" es igual a "+(x*y)+"<br>");
}

ejecutador(ejecutada,2,3);
ejecutador2("ejecutada"); 
//-->
</script>
El problema es que sólo se podría ejecutar correctamente en este caso las funciones que sólo tenga 2 argumentos, para solucionar este problema he hecho una función que detecte cuantos argumentos necesita y para después escribir un string de la llamada a la función y aplicarle eval:

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Operator</title>
</head>
<body>
<div id="test"></div>
<script language="JavaScript" type="text/javascript">
<!--
function display_doc(str){
  document.getElementById("test").innerHTML = str;
}
function add(x,y,z){
  return x + y + z;
}
function subtract(x,z){
  return x-z;
}
function string_1(s0,s1){
 return (s0 + s1).toUpperCase();
}
function string_(){
 return "Sin argumentos";
}

function operator(){
  var lg = arguments.length
 // comprobamos que se hayan enviado los argumentos necesarios
 if(arguments[0].length !=lg -2){
	alert("Error, en el envio de argumentos.\nFunción:" + arguments[0])
 }
 // si se ha enviado bien los argumentos escribimos en un cadena la llamada a la función
 else{
   var call_function = "arguments[0](";
   if(lg > 2){
	   for(var ctr =1; ctr < lg-2; ctr++){
		  call_function += "arguments[" + ctr + "],";
	   }
		call_function += "arguments[" +(lg-2)+ "])";
   }
   else{
     call_function += ")";
   }
   //llamamos a la función 
   if(arguments[lg-1]){
   return eval(call_function);
   }
   else{
   eval(call_function);
   }
 }
}

alert(operator(add,1,2,3,true));
alert(operator(subtract,6,2,true));
alert(operator(string_,true));
operator(display_doc,(operator(string_1, operator(subtract,5,2,true)," manzanas",true)),false);
//-->
</script>

</body>
</html>
Aparte de enviar la función y sus argumentos a la función operator he añadido como ultimo argumento un valor boolean, para indicar si la función debe devolver un valor.
Se puede omitir la comprobación de argumentos, esto es sólo para depurar el código.
Código PHP:

function operator(){
   var 
lg arguments.length
   
var call_function "arguments[0](";
   if(
lg 2){
       for(var 
ctr =1ctr lg-2ctr++){
          
call_function += "arguments[" ctr "],";
       }
        
call_function += "arguments[" +(lg-2)+ "])";
   }
   else{
     
call_function += ")";
   }
   
//llamamos a la función 
   
if(arguments[lg-1]){
        return eval(
call_function);
   }
   else{
        eval(
call_function);
   }
 


Bueno espero que te sirva.

Saludos
  #7 (permalink)  
Antiguo 11/09/2005, 16:07
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Ante todo gracias por responder kepawe.

Lo que me planteas me abre los ojos, porque no sabia que se podia hacer esto:
Código PHP:
function f(x,y) {
    return 
x*y;
}

function 
ejecutador(fun,x,y) {
    
alert( eval(fun)(x,y) );
}

ejecutador(f,2,3); 
Lo que yo hacia, precariamente, era extraer el nombre de la funcion (con tratamiento de cadenas), y ocuparme de los argumentos como has hecho tu:

Código PHP:
function ejecutador(funcion) {
    
//guardamos el nombre, para llamarla
    
var nombre=funcion.toString().substring("function ".lengthfuncion.toString().indexOf("(") );
    
//guardamos tambien los argumentos
    
var argumentos="";
    for(var 
a=1;a<arguments.length;a++)
        
argumentos+=arguments[a]+",";
    
argumentos=argumentos.substring(0,argumentos.length-",".length);    //le quitamos la ultima coma 
Y luego llamaba a la funcion, segun fuera el navegador, con la idea de caricatos:

Código PHP:
        //Caso Internet Explorer
    
if(document.all) { 
        eval(
funcion);
        return eval(
"window['"+nombre+"']("+argumentos+")"); 
    } 
    
//Otros casos
    
else { 
        var 
scrNuevo document.createElement("script"); 
        
scrNuevo.innerHTML funcion
        
document.body.appendChild(scrNuevo); 
        return eval(
nombre+"("+argumentos+")");
    } 

Asi que bueno, si esta solucionado el tema, podemos dar la duda como despejada.


Gracias a los dos otra vez!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 06:53.