Ver Mensaje Individual
  #6 (permalink)  
Antiguo 11/09/2005, 14:39
kepawe
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 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