[Php-avanzado] Funciones anónimas

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Jue Oct 18 11:56:57 ART 2012


Aportando un detalle más a la clarísima explicación de Matías, su
sobreescribís una función, ya sea la que la reemplaza anónima o no, la
función tiene que aceptar y procesar los mismos parámetros que la
función que va a reemplazar, ya que si no, el reemplazo no tiene forma
de realizar la misma tarea que hacía la función original.

En el ejemplo de Matías:

botones.onclick =(function(links){
    return function(){
       document.location.href=links;
    };
 })(linkid);

	La función está orientada a manejar el evento click de un enlace A, ya
que lo que hace es hacer que el navegador cambie a otro URL.

	Ahora bien, si la idea es usar botones para ir a una página o a otra,
creo que por la simpleza y por dar los mismos resultados, vale la pena
generar directamente enlaces A y decorarlos con CSS para que se vean
como un botón...

	Por otra parte, con solo las porciones de código enviadas y sin la
página HTML en dónde funcionan, no podemos probar el código, sino solo
darnos una idea de lo que haría.

	Por último, y si no veo mal, el código en el while del JS crea botones
y los decora con CSS... en vez de estar el CSS fuera decorando los
elementos y en vez de devolver la página con los botones/enlaces
generados desde el servidor en PHP, con lo que se gana al menos un
ahorro considerable de validaciones a hacer con los datos que llegan.

	Saludos!


El jue, 18-10-2012 a las 10:57 -0300, Matias Gea escribió:
> Buenas.
> 
> Te funciona bien el código? No le falta un return? Debería ser:
> 
> botones.onclick =(function(links){ return function(){
> document.location.href=links; }; })(linkid);
> 
> Lo que sucede es que si haces "botones.onclick
> =function(){document.location.href=links};" el valor de la variable
> queda enlazado a la variable, y tu variable está creada como global
> (deberías hacer var linkid=..., para crearla en el ámbito de la
> función). Por eso, al clickear cualquier botón usa el último valor que
> se le cargó. Si crearas variables locales, el comportamiento es más
> errático.
> 
> Lo más seguro es hacer que el valor sea estático para la funcion.
> 
> Primero tenemos que tener en cuenta que la propiedad onclik requiere
> que se le de una función como parámetro. Tambien, que al llamar una
> función entre paréntesis, la estamos ejecutando, es decir, al hacer:
> 
> (function(variable){ alert(variable); })('hola');
> 
> estamos creando una funcion anónima y ejecutándola a la vez con el
> parámetro 'hola'. El return de esta función es undefined, como cualquier
> funcion que no devuelve nada.
> 
> Lo que hacemos, específicamente para crear una función con un valor
> estático sacado de una variable, es ejecutar una función anónima
> pasando como parámetro la variable que queremos hacer estática y que
> esta función devuelva otra función, que se va a asignar al evento.
> 
> Entonces:
> 
> botones.onclick =(function(links){
>    return function(){
>       document.location.href=links;
>    };
> })(linkid);
> 
> lo que hace es ejecutar una función anónima que crea un ámbito en el
> que se setean las variables que le pasamos (en este caso links) con
> los valores que pasamos al momento de la ejecución (que es el mismo
> momento en que creamos esta función "creadora", por lo dicho antes) y
> devuelve otra función anónima que toma sus propios parámetros (que
> serán pasados por el manejador de eventos del browser, en este caso) y
> donde la variable "links" tiene un valor estático.
> 
> Espero se haya entendido bien. Una vez que se entiende el concepto, es
> simple, sino es un quilombo de funciones y paréntesis.
> 
> Otras dos cosas:
> - Los parsers del lenguaje en casi todos los navegadores no lo marcan
> como error, pero no te conviene "comerte" ningún punto y coma. El
> parser busca un punto y coma, si no lo encuentra espera el final de
> linea. Esto funciona muchas veces, pero si pasás el código por un
> compresor o "minifier", vas a tener problemas, ya que estos sistemas
> lo que hacen es quitar todos los espacios y saltos de linea antes de
> comprimir, y te queda código inválido.
> - Muchas veces no es problema, pero en sistemas que son muy intensivos
> en el uso de javascript y en navegadores no muy modernos el uso de
> recursos es importante. Te conviene ver bien el ámbito de todas las
> variables y definir como locales las necesarias. Sino te quedan todas
> las variables definidas como globales (a nivel window) y quedan
> gastando memoria.
> 
> Saludos!
> 
> 
> El día 18 de octubre de 2012 09:46, Juan Manuel P.
> <tucu_21 en hotmail.com> escribió:
> > Leo acá te paso lo que te comente ayer de las funciones anónimas. Así me han
> > funcionado los eventos que tienen las etiquetas input (ya sean button,
> > submit, reset, text, etc).
> > Cuando creo uno de estas etiquetas mediante código JavaScript para después
> > agregarlas al html la única forma que encontré es esta:
> >
> > while (i<Nombres.length)
> >           {
> >               //Crea boton Agregar, Modificar y Eliminar
> >               botones = document.createElement('input');
> >               botones.type = 'button';
> >               botones.name = 'subbot'+i;
> >               botones.value= Nombres[i];
> >               botones.id=botones.name;
> >               botones.style.marginLeft='25px';
> >               linkid='../Admin/'+tagname.value+'/'+botones.value+'.php'
> >             botones.onclick
> > =(function(links){function(){document.location.href=links}})(linkid);
> >               if(tagname.value=='relaciones' && i==1)
> >               {
> >                   botones.disabled=true;
> >               }
> >               contenedor.appendChild(botones);
> >               i++;
> >         }
> >
> >
> > Si no lo hago de esta manera, por ejemplo haciendo:
> >
> > botones.onclick =function(){document.location.href=links};
> >
> > Cada vez que se hace click en cualquiera de todos los botones realiza la
> > acción pero de el ultimo que se creo.
> >
> >
> > In his heart, in his eyes
> > In his soul, there’s no sign of thunder
> > Screams, can you hear the screaming
> > When another restless soul must die
> >
> > _______________________________________________
> > Php-avanzado mailing list
> > Php-avanzado en pato2.fi.mdp.edu.ar
> > http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
> 
> 
> 

-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado