我将函数源代码存储在字符串中,例如:
var source="(function(){return Math.sin(x);})";我想把它传递给eval(),然后再计算它的值:
var f=eval(source);
var v=f();它工作得很好。但是,我希望能够在没有Math.前缀的情况下使用Math中的函数。所以我将能够做到:
var source="(function(){return sin(x);})";有没有一种简单的方法来实现这一点?我已经在使用WebGL了,所以它不需要和老的浏览器兼容。
其他信息:
我知道eval()很糟糕。我正在编写函数图形器,source是用户输入的将要绘制的函数。这也是为什么要去掉Math.前缀的原因。
我知道它不会很漂亮,但我不会写我自己的解析器。也许还有更好的方法?
发布于 2011-11-09 02:41:39
您可以使用古老、缓慢、丑陋的with关键字来扩展作用域:
var source="(function(){return sin(x);})";
with (Math) {
var f=eval(source);
var v=f();
}另请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Statements/with
发布于 2011-11-09 02:42:30
发布于 2012-08-28 22:43:05
如果你要使用eval(),也许你可以使用用户输入的函数,做一些全局的,不区分大小写的替换:
var source = document.getElementById("someInputBox").value;
source = source.replace(/sin/ig,"Math.sin");
source = nsource.replace(/cos/ig,"Math.cos");
source = source.replace(/sqrt/ig,"Math.sqrt");
source = source.replace(/pi/ig,"Math.PI");
source = source.replace(/^/ig,"Math.PI");
source = source.replace(/([a-z]|\d+(?:\.\d+)?)*\s*\^\s*([a-z]|\d+(?:\.\d+)?)/ig, "Math.pow($1, $2)");
result = eval(source);重要提示: Math.pow()替代不适用于高级增强表达式,如5^(5-3^(2*2))。你需要找到一个更高级的策略来解决这些问题。这个website有一个用PHP编写的解决方案,它可能会被转换成javascript。
https://stackoverflow.com/questions/8055448
复制相似问题