【问题标题】:JavaScript eval() "syntax error" on parsing a function stringJavaScript eval() 解析函数字符串时出现“语法错误”
【发布时间】:2011-02-15 04:47:48
【问题描述】:

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

感谢任何想法。

【问题讨论】:

  • 请注意,IE 无法评估函数。
  • 试试var foo = function(value) { ... }
  • @SLaks:eval 对我来说在 IE 中对上面的字符串工作得很好,没有错误...eval("a = function () { return 'b'; }") 也是如此——你能澄清一下你的意思吗?
  • @Andy:将javascript:alert(eval("(function() { return 4; })"))粘贴到FF和IE的地址栏中。
  • 要在所有浏览器中评估函数,请使用eval("[function(){return 1}][0]");查看我对stackoverflow.com/questions/4599857/…的评论

标签: javascript function eval


【解决方案1】:

要做你想做的事,把你的字符串用括号括起来:

a = "function(value) { return Math.abs(value);}";
b = eval("("+a+")");
b(-1);

【讨论】:

  • 是的,这行得通。为什么 Firefox 在 Firebug 界面之外执行代码时需要括号,而使用 Firebug 控制台时不需要括号?
  • 一方面,即使在 Firebug 控制台中,如果没有大括号,我也无法让它工作。我不知道为什么它会为你工作。您使用的是哪个版本的 Firebug?
  • @Kenny Peng:我记得我自己曾经想过这个问题,并找到了类似问题的答案:stackoverflow.com/questions/964397/…。这是我看到这个问题时的第一个想法,+1 给@jhurshman 以获得他的答案。
  • @Jasper:我使用的是 Firebug 1.5.3。
  • @Kenny:我使用的是 1.5.4,所以也许有些东西发生了变化。我只能猜测它为什么在你的命令行中工作,但无论如何这可能是一件棘手的事情,因为命令行正在对你已经输入的内容执行 eval (或类似的东西)......
【解决方案2】:

括号是必需的,因为它们强制其中的内容在表达式上下文中进行评估,其中它必须是函数表达式。

如果没有括号,它可能是一个函数声明,它似乎有时会被这样解析——这可能是你描述的奇怪/不一致行为的根源.

比较这个函数声明:

function foo(arg) {}

使用这个函数表达式:

var funcExpr = function foo(arg) {};

如果它没有名字,它也必须是一个函数表达式。函数声明需要名称。

所以这不是一个有效的声明,因为它缺少它的名字:

function (arg) {}

但这是一个有效的匿名函数表达式:

var funcExpr = function(arg) {};

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多