Tengo un poco de código JavaScript que se especifica en un archivo de configuración en el lado del servidor. Como no puedo especificar una función de JavaScript en el lenguaje de configuración (Lua), la tengo como una cadena. El servidor devuelve la cadena de alguna JSON y tengo el cliente lo interpretan utilizando una función de limpieza:JavaScript eval() "error de sintaxis" al analizar una cadena de función
parse_fields = function(fields) {
for (var i = 0; i < fields.length; ++i) {
if (fields[i].sortType) {
sort_string = fields[i].sortType;
fields[i].sortType = eval(sort_string);
}
return fields;
}
};
Así que básicamente es simplemente evalúa sortType
si existe. El problema es que Firebug informa un "Error de sintaxis" en la línea eval()
. Cuando ejecuto los mismos pasos en la consola Firebug, funciona sin problemas y puedo ejecutar la función como espero. He intentado algunas variaciones diferentes: window.eval
en lugar de simple eval
, almacenando el sortType
como lo hice anteriormente, y probando pequeñas variaciones en la cadena.
Un valor de muestra de fields[i].sortType
es "function(value) { return Math.abs(value); }"
. Aquí está la prueba que hice en la consola de Firebug:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
y el error en sí en Firebug:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
El último bit que puede ser relevante es que todo esto está envuelto en una función Ext JS onReady()
, con un cambio de espacio de nombre Ext.ns
en la parte superior. Pero asumí que el window.eval
llamaría al eval
global, independientemente de cualquier posible eval
en espacios de nombres más específicos.
Se aprecian todas las ideas.
en cuenta que es decir, puede funciones no eval. – SLaks
intente 'var foo = function (value) {...}' –
@SLaks: 'eval' funciona bien para IE en la cadena anterior, sin errores ... al igual que' eval ("a = function () {return 'b';} ")' - ¿Puedes aclarar lo que quieres decir, por favor? –