recibir - Llamar a una función de JavaScript nombrada en una variable
pasar variables entre funciones javascript (4)
Definitivamente evite usar eval
para hacer algo como esto, o se abrirá a vulnerabilidades XSS (Cross-Site Scripting).
Por ejemplo, si tuviera que usar las soluciones eval
propuestas aquí, un usuario infame podría enviar un enlace a su víctima que se veía así:
http://yoursite.com/foo.html?func=function() {alerta (''Im% 20In% 20Teh% 20Codez'');}
Y su javascript, no el tuyo, sería ejecutado. Este código podría hacer algo mucho peor que solo mostrar una alerta, por supuesto; podría robar cookies, enviar solicitudes a su aplicación, etc.
Por lo tanto, asegúrese de nunca eval
código que no es de confianza que proviene de la entrada del usuario (y cualquier cosa en la identificación de la cadena de consulta considerada por el usuario). Puede tomar la entrada del usuario como una tecla que apuntará a su función, pero asegúrese de no ejecutar nada si la cadena dada no coincide con una clave en su objeto. Por ejemplo:
// set up the possible functions:
var myFuncs = {
func1: function () { alert(''Function 1''); },
func2: function () { alert(''Function 2''); },
func3: function () { alert(''Function 3''); },
func4: function () { alert(''Function 4''); },
func5: function () { alert(''Function 5''); }
};
// execute the one specified in the ''funcToRun'' variable:
myFuncs[funcToRun]();
Esto fallará si la variable funcToRun
no apunta a nada en el objeto myFuncs
, pero no ejecutará ningún código.
Esta pregunta ya tiene una respuesta aquí:
Tengo una variable de JavaScript que contiene el nombre de una función de JavaScript. Esta función existe en la página al haber sido cargada y colocada usando $ .ajax, etc.
¿Alguien puede decirme cómo llamaría a la función javascript nombrada en la variable, por favor?
El nombre de la función está en una variable porque la URL utilizada para cargar el fragmento de página (que se inserta en la página actual) contiene el nombre de la función a llamar.
Estoy abierto a otras sugerencias sobre cómo implementar esta solución.
Esto es algo feo, pero es lo primero que me vino a la cabeza. Esto también debería permitirle pasar argumentos:
eval(''var myfunc = '' + variable); myfunc(args, ...);
Si no necesita pasar argumentos, esto podría ser más simple.
eval(variable + ''();'');
Se aplica una advertencia estándar de código seco.
Evitaría la evaluación.
Para resolver este problema, debe saber estas cosas sobre JavaScript.
- Las funciones son objetos de primera clase, por lo que pueden ser propiedades de un objeto (en cuyo caso se les llama métodos ) o incluso elementos de matrices.
- Si no elige el objeto al que pertenece una función, pertenece al alcance global. En el navegador, eso significa que lo cuelgas en el objeto llamado "ventana", que es donde viven los globales.
- Arrays y objetos están íntimamente relacionados. (¡Se rumorea que podrían ser el resultado del incesto!) A menudo puede sustituir usando un punto
.
en lugar de corchetes[]
, o viceversa.
Su problema es el resultado de considerar el punto de referencia en lugar de la forma de corchetes.
Entonces, ¿por qué no algo así como,
window["functionName"]();
Eso es asumiendo que su función vive en el espacio global. Si has espacio de nombre, entonces:
myNameSpace["functionName"]();
Evite la evaluación y evite pasar una cadena a setTimeout y setInterval. Escribo mucho JS, y NUNCA necesito evaluación. La evaluación "necesaria" proviene de no conocer el lenguaje lo suficientemente profundo. Necesita aprender sobre alcance, contexto y sintaxis. Si alguna vez te has quedado con una evaluación, solo pregunta: aprenderás rápidamente.
Si está en el ámbito global, es mejor usar:
function foo()
{
alert(''foo'');
}
var a = ''foo'';
window[a]();
que eval()
. Porque eval()
es evaaaaaal .
Exactamente como Nosredna dijo 40 segundos antes de mí que es>. <