JavaScript eval () "erreur de syntaxe" lors de l'analyse d'une chaîne de caractères
J'ai un peu de code JavaScript qui est spécifié dans un fichier de configuration sur le serveur-côté. Puisque je ne peux pas spécifier une fonction JavaScript dans la configuration de la langue (Lua), j'ai comme une chaîne de caractères. Le serveur retourne une chaîne de caractères dans certains JSON et j'ai le client de l'interpréter à l'aide d'un nettoyage de la fonction:
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;
}
};
Donc, fondamentalement, il n'évalue sortType
si elle existe. Le problème est que Firebug fait état d'une "erreur de Syntaxe" sur le eval()
ligne. Lorsque j'exécute les mêmes étapes sur la console de Firebug, il fonctionne sans problème et je peux exécuter la fonction que j'attends. J'ai essayé quelques variantes différentes: window.eval
au lieu de la plaine eval
le stockage de la sortType
comme je l'ai fait ci-dessus, et en essayant de petites variations de la chaîne.
Un exemple de valeur de fields[i].sortType
est "function(value) { return Math.abs(value); }"
. Voici les tests que j'ai fait dans la console de Firebug:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
et l'erreur elle-même dans Firebug:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
Le dernier bit qui peuvent être pertinents, c'est que c'est le tout enveloppé dans un Ext JS onReady()
de fonction, avec une Ext.ns
de l'espace de noms du changement. Mais j'ai supposé que le window.eval
pourrait appeler le mondial eval
indépendamment de toute possible eval
en plus des espaces de noms spécifiques.
Toutes les idées sont les bienvenues.
source d'informationauteur Kenny Peng
Vous devez vous connecter pour publier un commentaire.
À faire ce que vous voulez, enveloppez votre chaîne entre parenthèses:
Les parenthèses sont obligatoires parce qu'ils ont la force de la chose à l'intérieur de leur être évaluée dans un contexte d'expression, où il doit être une fonction d'expression.
Sans les parenthèses, il pourrait plutôt s'agir d'une fonction déclarationet il semble comme si il est parfois interprétés de cette façon - ce qui pourrait être la source de l'étrange/comportement incohérent que vous décrivez.
Comparer cette déclaration de fonction:
avec cette fonction, l'expression:
Il dispose également d'une fonction d'expression si elle n'a pas un nom. Les déclarations de fonction exigent de noms.
Donc ce n'est pas une déclaration valide, car il manque un nom:
mais c'est valide, la fonction anonyme-expression: