我正在尝试使用eval()来评估带有变量和函数的数学字符串
ex:algo = "1+len+customfunction(6)"
所以我有len
的数据和customFunction
的函数。
它们显然在不同的范围内宣布。
我试过像
这样的东西process = function(vars, algo) {
return (function() {
algo = algo.toLowerCase();
return eval(algo);
}).call(vars);
};
我需要向eval提供所需的函数和变量。项目在不同的范围内,我该怎么做?
现在我有点迷茫和困惑,这甚至可能吗?
我认为使用eval('var'+vName+'='+value)
对于vars是可以的,但不适用于函数。
编辑:btw eval可以替换为(new Function(algo))() http://moduscreate.com/javascript-performance-tips-tricks/
答案 0 :(得分:0)
我会将所需数据移动到一个对象,该对象包含所有必需的项目。任何给定的字符串都可以访问。此解决方案不需要eval()
var data = {
customfunction: function (x) {
return Math.PI * x * x;
},
len: 5
};
var variable = 'len';
if (data[variable]) {
// do something
;
}
var fn = 'customFunction';
function evaluate(vars, algo) {
if (data[algo.toLowerCase()]) { //
return data[algo.toLowerCase()].call(vars);
} else {
// fallback
}
}
var process = evaluate(vars, algo);
答案 1 :(得分:0)
好的,我发现了:
所以,我设法:
在运行时替换我的算法字符串函数及其完整路径:
var algo = 'f(x)+5*2', x = 5;
window.object.functions.x = function(a) { return a*2; };
所以在运行时我将x(
替换为object.functions.x(
eval执行的代码最终是eval('object.functions.x(5)+5*2');
,输出当然是20:)
似乎有效。