Foros del Web » Programando para Internet » Javascript »

Funcion como parametro..

Estas en el tema de Funcion como parametro.. en el foro de Javascript en Foros del Web. Estoy intentando validar la existencia de una función, el problema radica en que esta función se pasa como parámetro... digamos Miclass.create({Verificar:newfunction}); el problema, es que ...
  #1 (permalink)  
Antiguo 04/02/2009, 20:43
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Pregunta Funcion como parametro..

Estoy intentando validar la existencia de una función, el problema radica en que esta función se pasa como parámetro...

digamos Miclass.create({Verificar:newfunction});

el problema, es que en el momento de definirla, ya existe un error por que el navegador intenta encontrar newfunction como variable o como función...

Asi que la idea sería cambiar a:
Miclass.create(Verificar:'newfunction');
Pasarla como texto, pero entonces ya no es útil como función, ya que solo es un texto....

Existe alguna forma de definirla de tipo String y luego retornarla nuevamente forma útil...

Creo que alguien mas tuvo el problema y lo publico, pero ya le di un recorrido y no encuentro el post.
  #2 (permalink)  
Antiguo 04/02/2009, 21:39
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Funcion como parametro..

Hola,

No se si te sea de alguna ayuda, pero Function() es un objeto normal en el lenguaje Javascript.

https://developer.mozilla.org/en/Cor...jects/Function

Saludos,
  #3 (permalink)  
Antiguo 04/02/2009, 23:25
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: Funcion como parametro..

Se puede, pero equivale a usar eval, que no es recomendable:
Código PHP:
<script>
function 
ejecutar(algo){
    new Function(
algo)();
}
ejecutar('alert("hola")');
</script> 
Mejor usar callbacks:
Código PHP:
<script>
function 
ejecutar2(callback){
    
callback();
}
ejecutar2(function(){alert(123);});
//o call o apply
function ejecutar3(o,f,a){
    var 
obj=|| window;
    var 
args=|| [];
    
f.apply(obj,a);
}
ejecutar3(null,alert,[455]);
</script> 
  #4 (permalink)  
Antiguo 05/02/2009, 02:28
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion como parametro..

No sé si termino de entender dónde está el problema...

Código javascript:
Ver original
  1. function verificar(fn) {
  2.     if ( !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /function/i.test( fn + "" ) ) {
  3.         alert("Es una función");
  4.     } else {
  5.         alert("No es una función");
  6.     }
  7. }
  8.  
  9. function unaFuncion() { alert("hi"); }
  10. var otraFuncion = function() { alert("ho"); };
  11. var noEsNada;
  12.  
  13. verificar(unaFuncion);
  14. verificar(otraFuncion);
  15. verificar(function() { alert("he"); });
  16. verificar(noEsNada);
  17. verificar("ha");
  #5 (permalink)  
Antiguo 05/02/2009, 09:08
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
De acuerdo Respuesta: Funcion como parametro..

Bueno, muchas gracias!

Si!, precisamente lo que deseaba evitar es usar EVAL... Ya que se desaconseja en todo lugar por que atenta a la seguridad de nuestros script.

Veré como analizo sus respuestas, y haber que fusión resulta...

Y nuevamente gracias a todos. Y un agradecimiento especial a panino por asistir sin falta a todos mis post y atender algunas cosas medio descabelladas que he publicado(Por cierto para cuando una clase de ajedrez?).

Un saludo desde Colombia!

Última edición por SPAWN3000; 05/02/2009 a las 09:18
  #6 (permalink)  
Antiguo 05/02/2009, 09:27
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
De acuerdo Respuesta: Funcion como parametro..

Cita:
Iniciado por venkman Ver Mensaje
No sé si termino de entender dónde está el problema...

Código javascript:
Ver original
  1. function verificar(fn) {
  2.     if ( !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /function/i.test( fn + "" ) ) {
  3.         alert("Es una función");
  4.     } else {
  5.         alert("No es una función");
  6.     }
  7. }
  8.  
  9. function unaFuncion() { alert("hi"); }
  10. var otraFuncion = function() { alert("ho"); };
  11. var noEsNada;
  12.  
  13. verificar(unaFuncion);
  14. verificar(otraFuncion);
  15. verificar(function() { alert("he"); });
  16. verificar(noEsNada);
  17. verificar("ha");
Mira el problema, que pasa si en vez de esto:
verificar(unaFuncion);
Le paso esto:
verificar('unaFuncion');
ya no funciona...es hay el problema, y lo segundo que deseo es descartar eval.

Pero gracias de todas formas!

//Otra forma de hacer lo que tu haces, con menos validaciones
//También se podría reducir con: var fn = (!vald)?'true':'false;
//Y no solo evalúa funciones si no variables globales.

var auForm ={
Read:function(idex){
var exx=document.getElementById(idex); //Valid id en pag.
if(!exx) {
alert('El elemento '+idex+' No existe');
return false;
}else{
alert('Si existe');
}
}
}

Un saludo.
  #7 (permalink)  
Antiguo 05/02/2009, 09:40
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
De acuerdo Respuesta: Funcion como parametro..

No es por capricho que deseo implementarlo así, es por que si el usuario realiza una petición...

invocarf.Read(parametro:funciondelusuario);

- Esto genera un error desde la pagina, ya que el navegador si no existe funciondelusuario, genera un error...

Pero si le agrego comillas, osea así:
invocarf.Read(parametro:'funciondelusuario');

Ya no me genera este error en la paginas, si no que me permite llegar hasta mi función de validación si problema. Pero!

Al agregarle comillas, el parámetro enviado como 'funciondelusuario', pierde su funcionalidad y lo toma como un simple texto.

y claro, al igual que todos, no deseo utilizar eval... por esto el complique.

Espero que ahora si puedan entenderme.

Por que todo este proceso:

Por seguridad: Obligar a usar una función que solo se encuentre definida en la pagina o que pertenezca ha este servidor, y no que pueda usar alguna función remota a través de eval, ya que utiliza ajax... puede hacer lo que se le antoje con la BD. Y este es un problema serio de seguridad.
  #8 (permalink)  
Antiguo 05/02/2009, 09:44
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion como parametro..

SPAWN3000, lo que tú haces ahí es comprobar si existe un elemento del DOM. Había entendido por tu primer mensaje que lo que querías era comprobar una función.


En cuanto a lo de pasar "unaFuncion"... ¿Realmente el usuario va a ejecutar en tu página "invocarf.Read(parametro:funciondelusuario)"?
  #9 (permalink)  
Antiguo 05/02/2009, 10:05
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Respuesta: Funcion como parametro..

Por cierto, dejo este dato:

http://www.aptana.com/jaxer

al parecer, buscan que el javascript se ejecute del lado del servidor...
Lo normal de una petición es: Navegador - servidor -navegador.

Con esto: Servidor - Navegador - Servidor.

Es probable que solucione muchos problemas, y muchos...Enfocados principalmente en aplicativos web, mas que en web estáticas. habrá que esperar a ver que sucede...Pero realmente espero algo muy bueno de esto. Si combinamos la forma habitual con la forma que ellos proponen.
  #10 (permalink)  
Antiguo 05/02/2009, 10:15
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
Mensaje Respuesta: Funcion como parametro..

Cita:
Iniciado por venkman Ver Mensaje
SPAWN3000, lo que tú haces ahí es comprobar si existe un elemento del DOM. Había entendido por tu primer mensaje que lo que querías era comprobar una función.


En cuanto a lo de pasar "unaFuncion"... ¿Realmente el usuario va a ejecutar en tu página "invocarf.Read(parametro:funciondelusuario)"?
Si mas o menos esa es la forma de invocar, solo que en la configuración de la libreria el puede hacer esto:

url = document.location.href.split('/')[2].toLowerCase(); //Conocer la dirección actual..
alert(url);

var config = {
safemode:false,
url:'www.mihost.com',
DsCookie:'false'
} //Habilitar el modoseguro, de ser así, mi script solo se ejecuta en mi web.

Luego al invocar esta función, siempre pasara por mi validor... El cual comprobara el lugar de donde se ejecuta el script que esta intentando ejecutar.

Actualmente está asi como la publicaste:
invocarf.Read(parametro:funciondelusuario);

la cuestión es que esto, no permite llegar funciondelusuario a mi script de validacion por el echo de que se ejecuta en el momento de la definición, por ello debo pasarlo de la forma 2, con las comillas:
invocarf.Read(parametro:'funciondelusuario');

y una vez validado, volver a retomar el procedimiento normal de la función.

No se si esta mal mi lógica, pero no encontré otro método...

Última edición por SPAWN3000; 05/02/2009 a las 10:41
  #11 (permalink)  
Antiguo 05/02/2009, 12:11
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Funcion como parametro..

La verdad es que no t sigo, SPAWN3000.

Quiero decir, si lo tuyo es una librería o un servicio web, y el "usuario" es un programador que utiliza tu librería, entonces creo que es responsabilidad suya pasar una función que sea válida. Si sólo puede ejecutar una función tuya, a elegir entre X funciones tuyas que ya están hechas, entonces que te pase un identificador, pero no el nombre de la función directamente.

Y si el "usuario" realmente es eso, un usuario final, que puede ejecutar eso, entonces no entiendo muy bien de qué va.
  #12 (permalink)  
Antiguo 05/02/2009, 13:33
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 2 meses
Puntos: 15
De acuerdo Respuesta: Funcion como parametro..

Mmmm, no es solo validar si la función existe, es validar si existe en el servidor actual o que pertenece a algún archivo JS existente... Es algo mas por seguridad. El usuario podrá implementar cuantas funciones desee(Que en este caso si es un programador), pero en la página. Para ello debe cambiar el parámetro safemode:true.

De todas formas, no se que tan factible sea este sistema... Solo necesito una librería AJAX, con algunos servicios extra, y con nivel de seguridad...Y que ademas pueda validar lo que ingresan los usuarios. Antes de ejecutarse (Los usuarios desarrolladores pueden implementar nuevas funciones), pero hay que evitar que lo hagan por inclusión remota los usuarios invitados... y validar el error en caso de que en la declaración se cree una función que no existe.

De todas formas, gracias! y te regalo apunto una estrella por tu interés. También me gustaría saber que opinan, si conocen un sistema mejor de validar esto.

Última edición por SPAWN3000; 05/02/2009 a las 14:16
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:29.