Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] dudas concepto eval()

Estas en el tema de dudas concepto eval() en el foro de Javascript en Foros del Web. Hola a todos, He leído por todos los lados que esta bien evitar emplear el eval() de javascript lo que no entiendo bien es el ...
  #1 (permalink)  
Antiguo 03/11/2015, 12:31
 
Fecha de Ingreso: mayo-2013
Mensajes: 191
Antigüedad: 11 años, 6 meses
Puntos: 10
dudas concepto eval()

Hola a todos,
He leído por todos los lados que esta bien evitar emplear el eval() de javascript lo que no entiendo bien es el porque !
Pongo el siguente ejemplo:
Código Javascript:
Ver original
  1. mi_funcion = function(parametros){
  2.     //haz algo con los parametros
  3.     //....... cualquier codigo javascript
  4. }
  5.  
  6. var mi_array = [
  7.     'mi_funcion(mis_parametros_1)',
  8.     'mi_funcion(mis_parametros_2)',
  9.     'mi_funcion(mis_parametros_3)',
  10.     'mi_funcion(mis_parametros_n)',
  11. ];
  12.  
  13. $.each(mi_array,function(){
  14.     eval(this);
  15. });

O sea lo que quiero es añadir dinamicamente al array mi_array cadenas que contengan llamadas a mi_funcion() con distintos parametros.
Para hacer que esto funcione tengo que hacer un eval() sobre los elementos de mi_array cuando lo necesito (tengan en cuenta que en otra llamada, mi_array podra tener otros elementos añadidos (o sea no es algo prestablecido )

Mi pregunta es:
¿Cual seria la razon para no hacer esto?
(Dejando de lado los argumentos abstractos como ... no es buena practica , esto no se aconseja etc...)
En concreto ¿Por que razones no se aconseja hacer esto?!

Gracias

Última edición por matake; 03/11/2015 a las 12:43
  #2 (permalink)  
Antiguo 03/11/2015, 13:31
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 2 meses
Puntos: 578
Respuesta: dudas concepto eval()

A parte de los riesgos de seguridad que conlleva por parte del cliente, la mayor parte de veces que se utiliza se hace inadecuadamente, y por ello se tiende a evitar. En tu caso existen muchas alternativas. Pongo un ejemplo.

Una vez has declarado la función, tan solo deberías guardar los parámetros en un array multidimensional y en el loop (each) invocar a dicha función con esos parámetros mediante el método apply:

Código Javascript:
Ver original
  1. var mi_funcion = function(uno,dos,tres){
  2.     console.log(uno,dos,tres);
  3. }
  4.  
  5. var mi_array = [
  6.   ["a","b","c"],
  7.   [1,2,3]
  8. ];
  9.  
  10. $.each(mi_array, function(key,value){
  11.     mi_funcion.apply(null, value);
  12. });


De esta forma estarías reutilizando código de forma bastante eficiente

Última edición por PHPeros; 03/11/2015 a las 13:47
  #3 (permalink)  
Antiguo 03/11/2015, 15:25
 
Fecha de Ingreso: mayo-2013
Mensajes: 191
Antigüedad: 11 años, 6 meses
Puntos: 10
Respuesta: dudas concepto eval()

Ok Gracias. Entendido. Desconocia lo de apply() (aunque si lo del call() me suena haberlo visto pero me olvide de el).
  #4 (permalink)  
Antiguo 03/11/2015, 16:21
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: dudas concepto eval()

Cita:
Iniciado por matake Ver Mensaje
[...]aunque si lo del call() me suena haberlo visto pero me olvide de el[...]
Básicamente, la diferencia entre un método y otro está en los argumentos que reciben. El primer argumento es el mismo, el cual será el this en la función. El segundo argumento en el método .apply(), es un array con los argumentos que recibirá la función, mientras que en el método .call(), dichos argumentos tienen que ir en la misma lista de argumentos de la llamada al método.

Código Javascript:
Ver original
  1. //Método .apply()
  2. funcion.apply(argThis, [arg1, arg2, argN]);
  3.  
  4. //Método .call()
  5. funcion.call(argThis, arg1, arg2, argN);

Y desde la implementación del estándar ECMAScript 5, también se puede pasar un objeto literal o una lista de nodos (Cuarto párrafo).

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 03/11/2015, 17:12
 
Fecha de Ingreso: mayo-2013
Mensajes: 191
Antigüedad: 11 años, 6 meses
Puntos: 10
Respuesta: dudas concepto eval()

Cita:
Iniciado por Alexis88 Ver Mensaje
Básicamente, la diferencia entre un método y otro está en los argumentos que reciben. El primer argumento es el mismo, el cual será el this en la función. El segundo argumento en el método .apply(), es un array con los argumentos que recibirá la función, mientras que en el método .call(), dichos argumentos tienen que ir en la misma lista de argumentos de la llamada al método.

Código Javascript:
Ver original
  1. //Método .apply()
  2. funcion.apply(argThis, [arg1, arg2, argN]);
  3.  
  4. //Método .call()
  5. funcion.call(argThis, arg1, arg2, argN);

Y desde la implementación del estándar ECMAScript 5, también se puede pasar un objeto literal o una lista de nodos (Cuarto párrafo).

Un saludo
yo me referia haber olvidado del call en el sentido que he olvidado ir en buscar informacion sobre el mismo pero al leer la sugerencia hecha por @PHPeros sobre el apply() acabe de leer la informacion (justamente lo que tu me estas comentando) donde dice que son casi identicos con las diferecias que me dices por esto mencione el call() antes.

Pero gracias de todos modos mejor leerla 2 veces que nunca
Saludos

Etiquetas: concepto, dudas, funcion
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 17:48.