解析函数字符串时的JavaScript eval()“语法错误”

时间:2010-05-03 20:20:36

标签: javascript function eval

我在服务器端的配置文件中指定了一些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

任何想法都表示赞赏。

2 个答案:

答案 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) {};