Ken*_*eng 14 javascript eval function
我有一些在服务器端的配置文件中指定的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;
}
};
Run Code Online (Sandbox Code Playgroud)
所以基本上它只是评估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
Run Code Online (Sandbox Code Playgroud)
和Firebug中的错误本身:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
Run Code Online (Sandbox Code Playgroud)
可能相关的最后一点是,这些都包含在Ext JS onReady()函数中,Ext.ns顶部更改了命名空间.但是我认为无论在更具体的命名空间中是什么,window.eval都会调用全局.evaleval
任何想法都表示赞赏.
jhu*_*man 41
要做你想做的事,将你的字符串包装在括号中:
a = "function(value) { return Math.abs(value);}";
b = eval("("+a+")");
b(-1);
Run Code Online (Sandbox Code Playgroud)
小智 5
括号是必需的,因为它们强制在它们内部的东西在表达式上下文中进行求值,它必须是一个函数表达式.
没有括号,它可能是一个函数声明,似乎它有时被解析 - 这可能是你描述的奇怪/不一致行为的来源.
比较这个函数声明:
function foo(arg) {}
Run Code Online (Sandbox Code Playgroud)
使用此函数表达式:
var funcExpr = function foo(arg) {};
Run Code Online (Sandbox Code Playgroud)
如果它没有名称,它也必须是函数表达式.函数声明需要名称.
所以这不是一个有效的声明,因为它缺少它的名字:
function (arg) {}
Run Code Online (Sandbox Code Playgroud)
但这是一个有效的匿名函数表达式:
var funcExpr = function(arg) {};
Run Code Online (Sandbox Code Playgroud)