首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在eval()中导入数学命名空间

在eval()中导入数学命名空间
EN

Stack Overflow用户
提问于 2011-11-09 02:38:17
回答 4查看 2.9K关注 0票数 1

我将函数源代码存储在字符串中,例如:

代码语言:javascript
复制
var source="(function(){return Math.sin(x);})";

我想把它传递给eval(),然后再计算它的值:

代码语言:javascript
复制
var f=eval(source);
var v=f();

它工作得很好。但是,我希望能够在没有Math.前缀的情况下使用Math中的函数。所以我将能够做到:

代码语言:javascript
复制
var source="(function(){return sin(x);})";

有没有一种简单的方法来实现这一点?我已经在使用WebGL了,所以它不需要和老的浏览器兼容。

其他信息:

我知道eval()很糟糕。我正在编写函数图形器,source是用户输入的将要绘制的函数。这也是为什么要去掉Math.前缀的原因。

我知道它不会很漂亮,但我不会写我自己的解析器。也许还有更好的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-09 02:41:39

您可以使用古老、缓慢、丑陋的with关键字来扩展作用域:

代码语言:javascript
复制
var source="(function(){return sin(x);})";
with (Math) {
    var f=eval(source);
    var v=f();
}

另请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Statements/with

票数 7
EN

Stack Overflow用户

发布于 2011-11-09 02:42:30

您可以使用来实现此目的:

代码语言:javascript
复制
var source="(function(){return Math.sin(x);})";
with(Math){
    var f = eval(source);
    var v = f();
}

另请参阅:

票数 3
EN

Stack Overflow用户

发布于 2012-08-28 22:43:05

如果你要使用eval(),也许你可以使用用户输入的函数,做一些全局的,不区分大小写的替换:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8055448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档