【发布时间】: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