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 =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);
}
}
Bueno espero que te sirva.
Saludos