在eval()中导入Math命名空间

Pio*_*zmo 1 javascript

我有一个存储在字符串中的函数源,例如:

var source="(function(){return Math.sin(x);})";
Run Code Online (Sandbox Code Playgroud)

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

var f=eval(source);
var v=f();
Run Code Online (Sandbox Code Playgroud)

它运作良好.但是,我希望能够使用MathMath.前缀的函数.所以我能做到:

var source="(function(){return sin(x);})";
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来实现这一目标?我已经使用了WebGL,因此它不必与旧版浏览器兼容.

附加信息:

我知道这eval()很糟糕.我正在编写函数grapher,source是由将要绘制的用户输入的函数.这也是为什么要摆脱Math.前缀的原因.

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

Lek*_*eyn 7

您可以使用古老,缓慢,丑陋的with关键字来扩展范围:

var source="(function(){return sin(x);})";
with (Math) {
    var f=eval(source);
    var v=f();
}
Run Code Online (Sandbox Code Playgroud)

另见:https://developer.mozilla.org/en/JavaScript/Reference/Statements/with