我在服务器端的配置文件中指定了一些JavaScript代码。由于我无法在配置语言(Lua)中指定JavaScript函数,因此我将其作为字符串。服务器返回一些JSON中的字符串,我让客户端使用清理函数解释它:
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;
}
};
所以基本上它只是评估sortType
是否存在。问题是Firebug在eval()
行上报告了“语法错误”。当我在Firebug控制台上运行相同的步骤时,它没有任何问题,我可以按照我的预期执行该功能。我尝试了一些不同的变体:window.eval
而不是普通的eval
,正如我上面所做的那样存储sortType
,并尝试对字符串进行小的修改。
fields[i].sortType
的样本值为"function(value) { return Math.abs(value); }"
。这是我在Firebug控制台中进行的测试:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
和Firebug中的错误本身:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
可能相关的最后一点是,这些都包含在Ext JS onReady()
函数中,顶部有Ext.ns
名称空间更改。但我假设window.eval
会调用全局eval
,而不管在更具体的命名空间中是否有eval
。
任何想法都表示赞赏。
答案 0 :(得分:41)
要做你想做的事,把你的字符串包在括号中:
a = "function(value) { return Math.abs(value);}";
b = eval("("+a+")");
b(-1);
答案 1 :(得分:5)
括号是必需的,因为它们强制在它们内部的东西在表达式上下文中进行求值,它必须是一个函数表达式。
如果没有括号,它可能是一个函数声明,似乎它有时被解析 - 这可能是你描述的奇怪/不一致行为的来源
比较这个函数声明:
function foo(arg) {}
使用此函数表达式:
var funcExpr = function foo(arg) {};
如果它没有名称,它也必须是一个函数表达式。函数声明需要名称。
所以这不是一个有效的声明,因为它缺少名称:
function (arg) {}
但这是一个有效的匿名函数表达式:
var funcExpr = function(arg) {};