Foros del Web » Programando para Internet » Javascript »

Definición de función de forma dinámica

Estas en el tema de Definición de función de forma dinámica en el foro de Javascript en Foros del Web. Wenas, a ver si me explico mas o menos. Necesito definir en cierto punto de código una función javascript, cuyos argumentos son dados dinámicamente. Como ...
  #1 (permalink)  
Antiguo 20/08/2008, 12:08
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
Definición de función de forma dinámica

Wenas, a ver si me explico mas o menos.

Necesito definir en cierto punto de código una función javascript, cuyos argumentos son dados dinámicamente. Como una imagen ( en este caso código) vale mas que 1000 palabras, dejo aqui el codigo:

.....

nuevaFuncion=function() {
decide(array[0],array[1],array[2]);
};


.......

Lo que quiero conseguir es que si por ejemplo array={10,20,30}, la función quede como :

nuevaFuncion=function() {
decide(10,20,30);
};


Mi problema es que parece que Javascript no traduce el contenido del array cuando se define una función, y me deja la función tal cual, es decir, con los argumentos "array[0], array[1],etc....

¿Alguien me puede ayudar?
Muchas gracias
  #2 (permalink)  
Antiguo 20/08/2008, 12:16
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 1 mes
Puntos: 839
Respuesta: Definición de función de forma dinámica

Una forma no muy correcta que diría yo, pero bueno, la única que se me ocurre sería hacer esto:
Código PHP:
document.write("<script language='javascript'>nuevaFuncion=function() { decide(" + array[0] + "," + array[1] + "," + array[2] +"); };</script>"
EDITO: hice las pruebas y no funciona, tal vez con eval
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 20/08/2008 a las 12:23
  #3 (permalink)  
Antiguo 20/08/2008, 12:47
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Definición de función de forma dinámica

Cita:
Iniciado por David el Grande Ver Mensaje
Una forma no muy correcta que diría yo, pero bueno, la única que se me ocurre sería hacer esto:
Código PHP:
document.write("<script language='javascript'>nuevaFuncion=function() { decide(" + array[0] + "," + array[1] + "," + array[2] +"); };</script>"
EDITO: hice las pruebas y no funciona, tal vez con eval
Gracias, he probado con eval y tampoco funciona. .
  #4 (permalink)  
Antiguo 20/08/2008, 12:51
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 1 mes
Puntos: 839
Pregunta Respuesta: Definición de función de forma dinámica

Yo hice las pruebas con eval y sí funcionó, ¿puedes poner el código de cómo estás intentando?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 20/08/2008, 14:11
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Definición de función de forma dinámica

Código PHP:
primera=new Array(10,20,30)
segunda=primera;
hola=function(bc)
{
    
alert(b[0]+' '+c[1]+' '+b[2]);
}
document.write("<script language='javascript'>hola2=function(b, c) { alert(b[0]+' '+c[1]+' '+b[2]); }; hola2(primera, segunda);</script>");
segunda[1]=15hola2(primerasegunda); 
a mi me anda de las 2 formas asi.. ya de por si anda con hola() sin necesidad de hola2()

Última edición por Fernand0; 20/08/2008 a las 14:17
  #6 (permalink)  
Antiguo 20/08/2008, 19:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Respuesta: Definición de función de forma dinámica

Hola Jawar:

No sé qué problema tienes en hacer esto:
Código PHP:
function decide(a,b,c) {
    
alert("a="+a+"\rb="+b+"\rc="+c);
}

var 
nuevaFuncion=function() {
    
decide(array[0],array[1],array[2]);
}


var array = [
10,20,30];
nuevaFuncion(); 
No le veo más vuelta de hoja. Si es que no sabes cuántos elementos va a tener array siempre existe Function.apply() para mandar los elementos del array como si fueran argumentos:
Código PHP:
function decide(a,b,c) {
    for(var 
i=0res=""i<arguments.lengthi++)
        
res+= "El argumento "+i+" es = "+arguments[i]+"\r";
    
alert(res);
}

var 
nuevaFuncion=function() {
    
decide.apply(window, array);
}


var array = [
10,20,30];
nuevaFuncion(); 
La sintaxis de apply() para llamar a f() con el array de argumentos ar si f() cuelga de window (a veces cuelga de otro objeto porque puede ser método de una clase) es:
Código PHP:
f.apply(windowar);     // Llamamos a f() ( = window.f() ) con los elementos de ar como argumentos
metodoDeObjeto(objetoar);     // Así llamamos a objeto.metodoDeObjeto() (metodoDeObjeto tiene que estar declarado fuera de la clase, como variable global) con los elementos de ar como argumentos 
Si con eso no lo solucionas expón un poco más tu problema porque no logro captarlo.

Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 21/08/2008, 04:32
Avatar de Jawar  
Fecha de Ingreso: octubre-2005
Ubicación: Málaga
Mensajes: 34
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Definición de función de forma dinámica

Muchas gracias por vuestras respuestas, os lo curráis un montón! Lo que habéis propuesto funciona, pero tengo un detalle mas por el cual no se si puedo aplicarlo.

En el código hago esto:

var antiguafuncion=disparador.onclick;

Si imprimo antiguafuncion, no sale interpretada, es decir, sale con los argumentos array[0],array[1],...

Luego, obtengo los argumentos de la función con split , y claro, obtengo las cadenas array[0],etc.. y no sus respectivos valores.

Todo este rollo viene a que cuando hago esto:

var antiguafuncion=disparador.onclick;

quiero añadir un argumento mas a la cabecera de la función que hay alojada en disparador.onclick.

Imaginaos que disparador.onclick tiene como llamada "decide(10,20,30)". Pues bien, quiero hacer que tenga como llamada por ejemplo "decide(10,20,30,40)"

Creo que lo de la función apply puede tener la solución, no la conocía. Voy a meditarla a ver.

Muchas gracias


EDITO: Con apply me ha valido lo que quería, muchas gracias a todos

Última edición por Jawar; 21/08/2008 a las 05:44 Razón: Solucionado
  #8 (permalink)  
Antiguo 21/08/2008, 04:48
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Definición de función de forma dinámica

También podés usar currying o partial:
http://ejohn.org/blog/partial-functions-in-javascript/
http://ajaxcookbook.org/currying-javascript-functions/
  #9 (permalink)  
Antiguo 21/08/2008, 08:22
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Respuesta: Definición de función de forma dinámica

También dejar por escrito aquí que existe call(), que funciona igual que apply() pero que no es tan útil, ya que los argumentos se pasan como argumentos, no como elementos de un array:

Código PHP:
metodo.call(objetoarg1arg2arg3);    // llamamos a objeto.metodo(arg1,arg2,arg3) 
El currying está bien, pero es algo dificil de leer.

Saludos.
__________________
- 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 21:53.